2015-03-02 13:24:30 +02:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
describe('$$cookieReader', function() {
|
2016-07-20 15:45:04 +02:00
|
|
|
var $$cookieReader, document;
|
2015-03-02 13:24:30 +02:00
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
|
|
|
|
|
describe('with access to `document.cookie`', function() {
|
|
|
|
|
|
|
|
|
|
function deleteAllCookies() {
|
|
|
|
|
var cookies = document.cookie.split(';');
|
|
|
|
|
var path = window.location.pathname;
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < cookies.length; i++) {
|
|
|
|
|
var cookie = cookies[i];
|
|
|
|
|
var eqPos = cookie.indexOf('=');
|
|
|
|
|
var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie;
|
|
|
|
|
var parts = path.split('/');
|
|
|
|
|
while (parts.length) {
|
|
|
|
|
document.cookie = name + '=;path=' + (parts.join('/') || '/') + ';expires=Thu, 01 Jan 1970 00:00:00 GMT';
|
|
|
|
|
parts.pop();
|
|
|
|
|
}
|
2015-03-02 13:24:30 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
beforeEach(function() {
|
|
|
|
|
document = window.document;
|
|
|
|
|
deleteAllCookies();
|
|
|
|
|
expect(document.cookie).toEqual('');
|
2015-03-02 13:24:30 +02:00
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
inject(function(_$$cookieReader_) {
|
|
|
|
|
$$cookieReader = _$$cookieReader_;
|
|
|
|
|
});
|
2015-03-02 13:24:30 +02:00
|
|
|
});
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
afterEach(function() {
|
|
|
|
|
deleteAllCookies();
|
|
|
|
|
expect(document.cookie).toEqual('');
|
|
|
|
|
});
|
2015-03-02 13:24:30 +02:00
|
|
|
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
describe('get via $$cookieReader()[cookieName]', function() {
|
2015-03-02 13:24:30 +02:00
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
it('should return undefined for nonexistent cookie', function() {
|
|
|
|
|
expect($$cookieReader().nonexistent).not.toBeDefined();
|
|
|
|
|
});
|
2015-03-02 13:24:30 +02:00
|
|
|
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
it('should return a value for an existing cookie', function() {
|
|
|
|
|
document.cookie = 'foo=bar=baz;path=/';
|
|
|
|
|
expect($$cookieReader().foo).toEqual('bar=baz');
|
|
|
|
|
});
|
2015-03-02 13:24:30 +02:00
|
|
|
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
it('should return the the first value provided for a cookie', function() {
|
|
|
|
|
// For a cookie that has different values that differ by path, the
|
|
|
|
|
// value for the most specific path appears first. $$cookieReader()
|
|
|
|
|
// should provide that value for the cookie.
|
|
|
|
|
document.cookie = 'foo="first"; foo="second"';
|
|
|
|
|
expect($$cookieReader()['foo']).toBe('"first"');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('should decode cookie values that were encoded by puts', function() {
|
|
|
|
|
document.cookie = 'cookie2%3Dbar%3Bbaz=val%3Due;path=/';
|
|
|
|
|
expect($$cookieReader()['cookie2=bar;baz']).toEqual('val=ue');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('should preserve leading & trailing spaces in names and values', function() {
|
|
|
|
|
document.cookie = '%20cookie%20name%20=%20cookie%20value%20';
|
|
|
|
|
expect($$cookieReader()[' cookie name ']).toEqual(' cookie value ');
|
|
|
|
|
expect($$cookieReader()['cookie name']).not.toBeDefined();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('should decode special characters in cookie values', function() {
|
|
|
|
|
document.cookie = 'cookie_name=cookie_value_%E2%82%AC';
|
|
|
|
|
expect($$cookieReader()['cookie_name']).toEqual('cookie_value_€');
|
|
|
|
|
});
|
2015-03-02 13:24:30 +02:00
|
|
|
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
it('should not decode cookie values that do not appear to be encoded', function() {
|
|
|
|
|
// see #9211 - sometimes cookies contain a value that causes decodeURIComponent to throw
|
|
|
|
|
document.cookie = 'cookie_name=cookie_value_%XX';
|
|
|
|
|
expect($$cookieReader()['cookie_name']).toEqual('cookie_value_%XX');
|
|
|
|
|
});
|
2015-03-02 13:24:30 +02:00
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
|
|
|
|
|
describe('getAll via $$cookieReader()', function() {
|
|
|
|
|
|
|
|
|
|
it('should return cookies as hash', function() {
|
|
|
|
|
document.cookie = 'foo1=bar1;path=/';
|
|
|
|
|
document.cookie = 'foo2=bar2;path=/';
|
|
|
|
|
expect($$cookieReader()).toEqual({'foo1':'bar1', 'foo2':'bar2'});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
it('should return empty hash if no cookies exist', function() {
|
|
|
|
|
expect($$cookieReader()).toEqual({});
|
|
|
|
|
});
|
|
|
|
|
|
2015-03-02 13:24:30 +02:00
|
|
|
});
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
|
|
|
|
|
it('should initialize cookie cache with existing cookies', function() {
|
|
|
|
|
document.cookie = 'existingCookie=existingValue;path=/';
|
|
|
|
|
expect($$cookieReader()).toEqual({'existingCookie':'existingValue'});
|
2015-03-02 13:24:30 +02:00
|
|
|
});
|
2016-12-20 10:25:16 +00:00
|
|
|
|
2015-03-02 13:24:30 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
describe('without access to `document.cookie`', function() {
|
|
|
|
|
var cookieSpy;
|
2015-03-02 13:24:30 +02:00
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
beforeEach(module(function($provide) {
|
|
|
|
|
cookieSpy = jasmine.createSpy('cookie').and.throwError('Can\'t touch this!');
|
|
|
|
|
document = Object.create({}, {'cookie': {get: cookieSpy}});
|
|
|
|
|
|
|
|
|
|
$provide.value('$document', [document]);
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
beforeEach(inject(function(_$$cookieReader_) {
|
|
|
|
|
$$cookieReader = _$$cookieReader_;
|
|
|
|
|
}));
|
2015-03-02 13:24:30 +02:00
|
|
|
|
|
|
|
|
|
2016-12-20 10:25:16 +00:00
|
|
|
it('should return an empty object', function() {
|
2015-03-02 13:24:30 +02:00
|
|
|
expect($$cookieReader()).toEqual({});
|
2016-12-20 10:25:16 +00:00
|
|
|
expect(cookieSpy).toHaveBeenCalled();
|
2015-03-02 13:24:30 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
});
|