From 7ec8e0d0c2c1cbc3a7713a8a1badfc507bcfa167 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 23 Apr 2020 17:48:34 +0200 Subject: [PATCH] plugins/graphiql: add tests for StorageBucket + minor fix --- .../src/lib/storage/StorageBucket.test.ts | 62 +++++++++++++++++++ .../graphiql/src/lib/storage/StorageBucket.ts | 2 +- 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/plugins/graphiql/src/lib/storage/StorageBucket.test.ts b/plugins/graphiql/src/lib/storage/StorageBucket.test.ts index 2b6046aefe..21fe10165c 100644 --- a/plugins/graphiql/src/lib/storage/StorageBucket.test.ts +++ b/plugins/graphiql/src/lib/storage/StorageBucket.test.ts @@ -27,4 +27,66 @@ describe('StorageBucket', () => { return bucket['dunno-this-one']; }).toThrow('Direct property access is not allowed for StorageBuckets'); }); + + describe('with mocked underlying storage', () => { + const mockStorage = { + getItem: jest.fn(), + setItem: jest.fn(), + removeItem: jest.fn(), + }; + const bucket = StorageBucket.forStorage( + (mockStorage as unknown) as Storage, + 'my-bucket', + ); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should set a first item', () => { + bucket.setItem('x', 'a'); + + expect(mockStorage.getItem).toHaveBeenCalledTimes(1); + expect(mockStorage.getItem).toHaveBeenLastCalledWith('my-bucket'); + expect(mockStorage.setItem).toHaveBeenCalledTimes(1); + expect(mockStorage.setItem).toHaveBeenLastCalledWith( + 'my-bucket', + JSON.stringify({ x: 'a' }), + ); + expect(mockStorage.removeItem).toHaveBeenCalledTimes(0); + }); + + it('should set a second item', () => { + mockStorage.getItem.mockReturnValueOnce(JSON.stringify({ y: 'b' })); + bucket.setItem('x', 'a'); + + expect(mockStorage.getItem).toHaveBeenCalledTimes(1); + expect(mockStorage.getItem).toHaveBeenLastCalledWith('my-bucket'); + expect(mockStorage.setItem).toHaveBeenCalledTimes(1); + expect(mockStorage.setItem).toHaveBeenLastCalledWith( + 'my-bucket', + JSON.stringify({ y: 'b', x: 'a' }), + ); + expect(mockStorage.removeItem).toHaveBeenCalledTimes(0); + }); + + it('should clear the bucket', () => { + bucket.clear(); + + expect(mockStorage.getItem).toHaveBeenCalledTimes(0); + expect(mockStorage.setItem).toHaveBeenCalledTimes(0); + expect(mockStorage.removeItem).toHaveBeenCalledTimes(1); + expect(mockStorage.removeItem).toHaveBeenLastCalledWith('my-bucket'); + }); + + it('should get an item', () => { + mockStorage.getItem.mockReturnValueOnce(JSON.stringify({ x: 'X' })); + expect(bucket.getItem('x')).toBe('X'); + + expect(mockStorage.getItem).toHaveBeenCalledTimes(1); + expect(mockStorage.getItem).toHaveBeenLastCalledWith('my-bucket'); + expect(mockStorage.setItem).toHaveBeenCalledTimes(0); + expect(mockStorage.removeItem).toHaveBeenCalledTimes(0); + }); + }); }); diff --git a/plugins/graphiql/src/lib/storage/StorageBucket.ts b/plugins/graphiql/src/lib/storage/StorageBucket.ts index eb8feb394d..06263583c3 100644 --- a/plugins/graphiql/src/lib/storage/StorageBucket.ts +++ b/plugins/graphiql/src/lib/storage/StorageBucket.ts @@ -54,7 +54,7 @@ export class StorageBucket implements Storage { } clear(): void { - this.write({}); + this.storage.removeItem(this.bucket); } getItem(key: string): string | null {