UNPKG

6.9 kBJavaScriptView Raw
1// Licensed to the Software Freedom Conservancy (SFC) under one
2// or more contributor license agreements. See the NOTICE file
3// distributed with this work for additional information
4// regarding copyright ownership. The SFC licenses this file
5// to you under the Apache License, Version 2.0 (the
6// "License"); you may not use this file except in compliance
7// with the License. You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing,
12// software distributed under the License is distributed on an
13// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14// KIND, either express or implied. See the License for the
15// specific language governing permissions and limitations
16// under the License.
17
18'use strict';
19
20var assert = require('assert'),
21 url = require('url');
22
23var test = require('../lib/test'),
24 fileserver = require('../lib/test/fileserver'),
25 Browser = require('..').Browser,
26 Pages = test.Pages;
27
28
29test.suite(function(env) {
30 var driver;
31
32 test.before(function*() {
33 driver = yield env.builder().build();
34 });
35
36 test.after(function() {
37 return driver.quit();
38 });
39
40 // Cookie handling is broken.
41 test.ignore(env.browsers(Browser.PHANTOM_JS, Browser.SAFARI)).
42 describe('Cookie Management;', function() {
43
44 test.beforeEach(function*() {
45 yield driver.get(fileserver.Pages.ajaxyPage);
46 yield driver.manage().deleteAllCookies();
47 return assertHasCookies();
48 });
49
50 test.it('can add new cookies', function*() {
51 var cookie = createCookieSpec();
52
53 yield driver.manage().addCookie(cookie);
54 yield driver.manage().getCookie(cookie.name).then(function(actual) {
55 assert.equal(actual.value, cookie.value);
56 });
57 });
58
59 test.it('can get all cookies', function*() {
60 var cookie1 = createCookieSpec();
61 var cookie2 = createCookieSpec();
62
63 yield driver.manage().addCookie(cookie1);
64 yield driver.manage().addCookie(cookie2);
65
66 return assertHasCookies(cookie1, cookie2);
67 });
68
69 test.ignore(env.browsers(Browser.IE)).
70 it('only returns cookies visible to the current page', function*() {
71 var cookie1 = createCookieSpec();
72
73 yield driver.manage().addCookie(cookie1);
74
75 var pageUrl = fileserver.whereIs('page/1');
76 var cookie2 = createCookieSpec({
77 path: url.parse(pageUrl).pathname
78 });
79 yield driver.get(pageUrl);
80 yield driver.manage().addCookie(cookie2);
81 yield assertHasCookies(cookie1, cookie2);
82
83 yield driver.get(fileserver.Pages.ajaxyPage);
84 yield assertHasCookies(cookie1);
85
86 yield driver.get(pageUrl);
87 yield assertHasCookies(cookie1, cookie2);
88 });
89
90 test.it('can delete all cookies', function*() {
91 var cookie1 = createCookieSpec();
92 var cookie2 = createCookieSpec();
93
94 yield driver.executeScript(
95 'document.cookie = arguments[0] + "=" + arguments[1];' +
96 'document.cookie = arguments[2] + "=" + arguments[3];',
97 cookie1.name, cookie1.value, cookie2.name, cookie2.value);
98 yield assertHasCookies(cookie1, cookie2);
99
100 yield driver.manage().deleteAllCookies();
101 yield assertHasCookies();
102 });
103
104 test.it('can delete cookies by name', function*() {
105 var cookie1 = createCookieSpec();
106 var cookie2 = createCookieSpec();
107
108 yield driver.executeScript(
109 'document.cookie = arguments[0] + "=" + arguments[1];' +
110 'document.cookie = arguments[2] + "=" + arguments[3];',
111 cookie1.name, cookie1.value, cookie2.name, cookie2.value);
112 yield assertHasCookies(cookie1, cookie2);
113
114 yield driver.manage().deleteCookie(cookie1.name);
115 yield assertHasCookies(cookie2);
116 });
117
118 test.it('should only delete cookie with exact name', function*() {
119 var cookie1 = createCookieSpec();
120 var cookie2 = createCookieSpec();
121 var cookie3 = {name: cookie1.name + 'xx', value: cookie1.value};
122
123 yield driver.executeScript(
124 'document.cookie = arguments[0] + "=" + arguments[1];' +
125 'document.cookie = arguments[2] + "=" + arguments[3];' +
126 'document.cookie = arguments[4] + "=" + arguments[5];',
127 cookie1.name, cookie1.value, cookie2.name, cookie2.value,
128 cookie3.name, cookie3.value);
129 yield assertHasCookies(cookie1, cookie2, cookie3);
130
131 yield driver.manage().deleteCookie(cookie1.name);
132 yield assertHasCookies(cookie2, cookie3);
133 });
134
135 test.it('can delete cookies set higher in the path', function*() {
136 var cookie = createCookieSpec();
137 var childUrl = fileserver.whereIs('child/childPage.html');
138 var grandchildUrl = fileserver.whereIs(
139 'child/grandchild/grandchildPage.html');
140
141 yield driver.get(childUrl);
142 yield driver.manage().addCookie(cookie);
143 yield assertHasCookies(cookie);
144
145 yield driver.get(grandchildUrl);
146 yield assertHasCookies(cookie);
147
148 yield driver.manage().deleteCookie(cookie.name);
149 yield assertHasCookies();
150
151 yield driver.get(childUrl);
152 yield assertHasCookies();
153 });
154
155 test.ignore(env.browsers(
156 Browser.ANDROID,
157 Browser.FIREFOX,
158 'legacy-' + Browser.FIREFOX,
159 Browser.IE)).
160 it('should retain cookie expiry', function*() {
161 let expirationDelay = 5 * 1000;
162 let expiry = new Date(Date.now() + expirationDelay);
163 let cookie = createCookieSpec({expiry});
164
165 yield driver.manage().addCookie(cookie);
166 yield driver.manage().getCookie(cookie.name).then(function(actual) {
167 assert.equal(actual.value, cookie.value);
168 // expiry times are exchanged in seconds since January 1, 1970 UTC.
169 assert.equal(actual.expiry, Math.floor(expiry.getTime() / 1000));
170 });
171
172 yield driver.sleep(expirationDelay);
173 yield assertHasCookies();
174 });
175 });
176
177 function createCookieSpec(opt_options) {
178 let spec = {
179 name: getRandomString(),
180 value: getRandomString()
181 };
182 if (opt_options) {
183 spec = Object.assign(spec, opt_options);
184 }
185 return spec;
186 }
187
188 function buildCookieMap(cookies) {
189 var map = {};
190 cookies.forEach(function(cookie) {
191 map[cookie.name] = cookie;
192 });
193 return map;
194 }
195
196 function assertHasCookies(...expected) {
197 return driver.manage().getCookies().then(function(cookies) {
198 assert.equal(cookies.length, expected.length,
199 'Wrong # of cookies.' +
200 '\n Expected: ' + JSON.stringify(expected) +
201 '\n Was : ' + JSON.stringify(cookies));
202
203 var map = buildCookieMap(cookies);
204 for (var i = 0; i < expected.length; ++i) {
205 assert.equal(expected[i].value, map[expected[i].name].value);
206 }
207 });
208 }
209
210 function getRandomString() {
211 var x = 1234567890;
212 return Math.floor(Math.random() * x).toString(36);
213 }
214});