Skip to content

Commit d497e57

Browse files
authored
Merge pull request #256 from gbaptista/gb-cookie
Improving the flow of retrieving and setting Cookies
2 parents 7f4a6bc + 5b008f9 commit d497e57

File tree

3 files changed

+123
-4
lines changed

3 files changed

+123
-4
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,18 @@ Sets given values as cookie
733733
browser.cookies.set(name: "stealth", value: "omg", domain: "google.com") # => true
734734
```
735735

736+
#### set(cookie) : `Boolean`
737+
738+
Sets given cookie
739+
740+
* cookie `Cookie`
741+
742+
```ruby
743+
nid_cookie = browser.cookies["NID"] # => <Ferrum::Cookies::Cookie:0x0000558624b67a88>
744+
745+
browser.cookies.set(nid_cookie) # => true
746+
```
747+
736748
#### remove(\*\*options) : `Boolean`
737749

738750
Removes given cookie

lib/ferrum/cookies.rb

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
module Ferrum
44
class Cookies
55
class Cookie
6+
attr_reader :attributes
7+
68
def initialize(attributes)
79
@attributes = attributes
810
end
@@ -61,10 +63,11 @@ def [](name)
6163
all[name]
6264
end
6365

64-
def set(name: nil, value: nil, **options)
65-
cookie = options.dup
66-
cookie[:name] ||= name
67-
cookie[:value] ||= value
66+
def set(options)
67+
cookie = (
68+
options.is_a?(Cookie) ? options.attributes : options
69+
).dup.transform_keys(&:to_sym)
70+
6871
cookie[:domain] ||= default_domain
6972

7073
cookie[:httpOnly] = cookie.delete(:httponly) if cookie.key?(:httponly)

spec/cookies_spec.rb

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,110 @@ module Ferrum
5656
expect(browser.body).to_not include("test_cookie")
5757
end
5858

59+
it "can set a retrieved cookie" do
60+
browser.cookies.set(name: "stealth", value: "omg")
61+
62+
browser.go_to("/get_cookie")
63+
64+
expect(browser.body).to include("omg")
65+
66+
cookie = browser.cookies.all.values.first
67+
68+
browser.cookies.clear
69+
70+
browser.go_to("/get_cookie")
71+
72+
expect(browser.body).to_not include("omg")
73+
74+
browser.cookies.set(cookie)
75+
76+
browser.go_to("/get_cookie")
77+
78+
expect(browser.body).to include("omg")
79+
end
80+
81+
it "can set a retrieved browser cookie" do
82+
browser.go_to("/set_cookie")
83+
84+
cookie = browser.cookies["stealth"]
85+
86+
expect(cookie.name).to eq("stealth")
87+
expect(cookie.value).to eq("test_cookie")
88+
89+
browser.go_to("/get_cookie")
90+
91+
expect(browser.body).to include("test_cookie")
92+
93+
browser.cookies.clear
94+
95+
browser.go_to("/get_cookie")
96+
97+
expect(browser.body).not_to include("test_cookie")
98+
99+
browser.cookies.set(cookie)
100+
101+
browser.go_to("/get_cookie")
102+
103+
expect(browser.body).to include("test_cookie")
104+
end
105+
106+
it "it retains the characteristics of the reference cookie" do
107+
browser.cookies.set(name: "stealth", value: "omg", domain: "site.com")
108+
109+
expect(browser.cookies["stealth"].name).to eq("stealth")
110+
expect(browser.cookies["stealth"].value).to eq("omg")
111+
expect(browser.cookies["stealth"].domain).to eq("site.com")
112+
113+
cookie = browser.cookies["stealth"]
114+
115+
browser.cookies.clear
116+
117+
expect(browser.cookies["stealth"]).to eq(nil)
118+
119+
browser.cookies.set(cookie)
120+
121+
expect(browser.cookies["stealth"].name).to eq("stealth")
122+
expect(browser.cookies["stealth"].value).to eq("omg")
123+
expect(browser.cookies["stealth"].domain).to eq("site.com")
124+
125+
browser.cookies.clear
126+
127+
expect(browser.cookies["stealth"]).to eq(nil)
128+
129+
browser.cookies.set(cookie.attributes)
130+
131+
expect(browser.cookies["stealth"].name).to eq("stealth")
132+
expect(browser.cookies["stealth"].value).to eq("omg")
133+
expect(browser.cookies["stealth"].domain).to eq("site.com")
134+
end
135+
136+
it "it prevents side effects for params" do
137+
cookie_params = { name: "stealth", value: "test_cookie" }
138+
139+
original_cookie_params = cookie_params.dup
140+
141+
browser.cookies.set(cookie_params)
142+
143+
expect(cookie_params).to eq(original_cookie_params)
144+
end
145+
146+
it "it prevents side effects for cookie object" do
147+
browser.cookies.set(name: "stealth", value: "omg")
148+
149+
cookie = browser.cookies["stealth"]
150+
151+
cookie.instance_variable_set(
152+
:@attributes,
153+
{ "name" => "stealth", "value" => "test_cookie", "domain" => "site.com" }
154+
)
155+
156+
original_attributes = cookie.attributes.dup
157+
158+
browser.cookies.set(cookie)
159+
160+
expect(cookie.attributes).to eq(original_attributes)
161+
end
162+
59163
it "can clear cookies" do
60164
browser.go_to("/set_cookie")
61165

0 commit comments

Comments
 (0)