1import pytest
2
3from datetime import datetime, timedelta
4
5
6from tests.support.asserts import assert_error, assert_success
7from tests.support.helpers import clear_all_cookies
8
9
10def get_named_cookie(session, name):
11    return session.transport.send(
12        "GET", "session/{session_id}/cookie/{name}".format(
13            session_id=session.session_id,
14            name=name))
15
16
17def test_no_top_browsing_context(session, closed_window):
18    response = get_named_cookie(session, "foo")
19    assert_error(response, "no such window")
20
21
22def test_no_browsing_context(session, closed_frame):
23    response = get_named_cookie(session, "foo")
24    assert_error(response, "no such window")
25
26
27def test_get_named_session_cookie(session, url):
28    session.url = url("/common/blank.html")
29    clear_all_cookies(session)
30    session.execute_script("document.cookie = 'foo=bar'")
31
32    result = get_named_cookie(session, "foo")
33    cookie = assert_success(result)
34    assert isinstance(cookie, dict)
35
36    # table for cookie conversion
37    # https://w3c.github.io/webdriver/#dfn-table-for-cookie-conversion
38    assert "name" in cookie
39    assert isinstance(cookie["name"], str)
40    assert "value" in cookie
41    assert isinstance(cookie["value"], str)
42    assert "path" in cookie
43    assert isinstance(cookie["path"], str)
44    assert "domain" in cookie
45    assert isinstance(cookie["domain"], str)
46    assert "secure" in cookie
47    assert isinstance(cookie["secure"], bool)
48    assert "httpOnly" in cookie
49    assert isinstance(cookie["httpOnly"], bool)
50    if "expiry" in cookie:
51        assert cookie.get("expiry") is None
52    assert "sameSite" in cookie
53    assert isinstance(cookie["sameSite"], str)
54
55    assert cookie["name"] == "foo"
56    assert cookie["value"] == "bar"
57
58
59def test_get_named_cookie(session, url):
60    session.url = url("/common/blank.html")
61    clear_all_cookies(session)
62
63    # same formatting as Date.toUTCString() in javascript
64    utc_string_format = "%a, %d %b %Y %H:%M:%S"
65    a_day_from_now = (datetime.utcnow() + timedelta(days=1)).strftime(utc_string_format)
66    session.execute_script("document.cookie = 'foo=bar;expires=%s'" % a_day_from_now)
67
68    result = get_named_cookie(session, "foo")
69    cookie = assert_success(result)
70    assert isinstance(cookie, dict)
71
72    assert "name" in cookie
73    assert isinstance(cookie["name"], str)
74    assert "value" in cookie
75    assert isinstance(cookie["value"], str)
76    assert "expiry" in cookie
77    assert isinstance(cookie["expiry"], int)
78    assert "sameSite" in cookie
79    assert isinstance(cookie["sameSite"], str)
80
81    assert cookie["name"] == "foo"
82    assert cookie["value"] == "bar"
83    # convert from seconds since epoch
84    assert datetime.utcfromtimestamp(
85        cookie["expiry"]).strftime(utc_string_format) == a_day_from_now
86
87
88def test_duplicated_cookie(session, url, server_config, inline):
89    new_cookie = {
90        "name": "hello",
91        "value": "world",
92        "domain": server_config["browser_host"],
93        "path": "/",
94        "http_only": False,
95        "secure": False
96    }
97
98    session.url = url("/common/blank.html")
99    clear_all_cookies(session)
100
101    session.set_cookie(**new_cookie)
102    session.url = inline("""
103      <script>
104        document.cookie = '{name}=newworld; domain={domain}; path=/';
105      </script>""".format(
106        name=new_cookie["name"],
107        domain=server_config["browser_host"]))
108
109    result = get_named_cookie(session, new_cookie["name"])
110    cookie = assert_success(result)
111    assert isinstance(cookie, dict)
112
113    assert "name" in cookie
114    assert isinstance(cookie["name"], str)
115    assert "value" in cookie
116    assert isinstance(cookie["value"], str)
117    assert "sameSite" in cookie
118    assert isinstance(cookie["sameSite"], str)
119
120    assert cookie["name"] == new_cookie["name"]
121    assert cookie["value"] == "newworld"
122
123
124@pytest.mark.parametrize("same_site", ["None", "Lax", "Strict"])
125@pytest.mark.capabilities({"acceptInsecureCerts": True})
126def test_get_cookie_with_same_site_flag(session, url, same_site):
127    session.url = url("/common/blank.html", protocol="https")
128    clear_all_cookies(session)
129
130    session.execute_script("document.cookie = 'foo=bar;Secure;SameSite=%s'" % same_site)
131
132    result = get_named_cookie(session, "foo")
133    cookie = assert_success(result)
134    assert isinstance(cookie, dict)
135
136    assert "name" in cookie
137    assert isinstance(cookie["name"], str)
138    assert "value" in cookie
139    assert isinstance(cookie["value"], str)
140    assert "sameSite" in cookie
141    assert isinstance(cookie["sameSite"], str)
142
143    assert cookie["name"] == "foo"
144    assert cookie["value"] == "bar"
145    assert cookie["sameSite"] == same_site
146