Merge "ApiCSPReport: Log user ID instead of name, and limit urls to origin"
[lhc/web/wiklou.git] / tests / qunit / suites / resources / mediawiki / mediawiki.storage.test.js
1 ( function () {
2 QUnit.module( 'mediawiki.storage' );
3
4 QUnit.test( 'set/get(Object) with storage support', function ( assert ) {
5 var data = {},
6 object = { test: 'value' },
7 stub = {
8 setItem: function ( k, v ) {
9 data[ k ] = v;
10 return true;
11 },
12 getItem: function ( k ) {
13 return Object.prototype.hasOwnProperty.call( data, k ) ? data[ k ] : null;
14 },
15 removeItem: function ( k ) {
16 delete data[ k ];
17 return true;
18 }
19 };
20
21 this.sandbox.stub( mw.storage, 'store', stub );
22
23 assert.strictEqual( mw.storage.set( 'foo', 'test' ), true, 'set returns true' );
24 assert.strictEqual( mw.storage.get( 'foo' ), 'test', 'Check value gets stored' );
25 assert.strictEqual( mw.storage.get( 'bar' ), null, 'Unset values are null' );
26 assert.strictEqual( mw.storage.remove( 'foo' ), true, 'remove returns true' );
27 assert.strictEqual( mw.storage.get( 'foo' ), null, 'Removed item is null' );
28
29 assert.strictEqual( mw.storage.setObject( 'baz', object ), true, 'setObject returns true' );
30 assert.deepEqual( mw.storage.getObject( 'baz' ), object, 'Check value gets stored' );
31 assert.notStrictEqual( mw.storage.getObject( 'baz' ), object, 'Retrieved value is a new object' );
32 assert.strictEqual( mw.storage.getObject( 'quux' ), null, 'Unset values are null' );
33 assert.strictEqual( mw.storage.remove( 'baz' ), true, 'remove returns true' );
34 assert.strictEqual( mw.storage.getObject( 'baz' ), null, 'Removed item is null' );
35
36 mw.storage.set( 'baz', 'Non-JSON' );
37 assert.strictEqual( mw.storage.getObject( 'baz' ), null, 'Non-JSON values are null' );
38
39 } );
40
41 QUnit.test( 'set/get(Object) with storage methods disabled', function ( assert ) {
42 // This covers browsers where storage is disabled
43 // (quota full, or security/privacy settings).
44 // On most browsers, these interface will be accessible with
45 // their methods throwing.
46 var stub = {
47 getItem: this.sandbox.stub(),
48 removeItem: this.sandbox.stub(),
49 setItem: this.sandbox.stub()
50 };
51 stub.getItem.throws();
52 stub.setItem.throws();
53 stub.removeItem.throws();
54 this.sandbox.stub( mw.storage, 'store', stub );
55
56 assert.strictEqual( mw.storage.get( 'foo' ), false );
57 assert.strictEqual( mw.storage.set( 'foo', 'test' ), false );
58 assert.strictEqual( mw.storage.remove( 'foo' ), false );
59
60 assert.strictEqual( mw.storage.getObject( 'bar' ), false );
61 assert.strictEqual( mw.storage.setObject( 'bar', { test: 'value' } ), false );
62 assert.strictEqual( mw.storage.remove( 'bar' ), false );
63 } );
64
65 QUnit.test( 'set/get(Object) with storage object disabled', function ( assert ) {
66 // On other browsers, these entire object is disabled.
67 // `'localStorage' in window` would be true (and pass feature test)
68 // but trying to read the object as window.localStorage would throw
69 // an exception. Such case would instantiate SafeStorage with
70 // undefined after the internal try/catch.
71 var old = mw.storage.store;
72 mw.storage.store = undefined;
73
74 assert.strictEqual( mw.storage.get( 'foo' ), false );
75 assert.strictEqual( mw.storage.set( 'foo', 'test' ), false );
76 assert.strictEqual( mw.storage.remove( 'foo', 'test' ), false );
77
78 assert.strictEqual( mw.storage.getObject( 'bar' ), false );
79 assert.strictEqual( mw.storage.setObject( 'bar', { test: 'value' } ), false );
80 assert.strictEqual( mw.storage.remove( 'bar' ), false );
81
82 mw.storage.store = old;
83 } );
84
85 }() );