From 8e701b9f6ee28573990b0a81b7f3e3a18e5d38c7 Mon Sep 17 00:00:00 2001 From: Jeezman Date: Tue, 21 Nov 2023 22:37:10 +0100 Subject: [PATCH 1/9] chore: update user object --- frontend/app/src/__test__/__mockData__/user.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/app/src/__test__/__mockData__/user.ts b/frontend/app/src/__test__/__mockData__/user.ts index 18e4086b6..c7a0736fc 100644 --- a/frontend/app/src/__test__/__mockData__/user.ts +++ b/frontend/app/src/__test__/__mockData__/user.ts @@ -1,11 +1,15 @@ +import { v4 as uuidv4 } from 'uuid'; import { MeInfo } from '../../store/ui'; export const user: MeInfo = { id: 1, pubkey: 'test_pub_key', + uuid: uuidv4(), contact_key: 'test_owner_contact_key', + owner_route_hint: 'test_owner_route_hint', alias: 'Vladimir', photo_url: '', + github_issues: [], route_hint: 'test_hint:1099567661057', price_to_meet: 0, jwt: 'test_jwt', @@ -22,5 +26,6 @@ export const user: MeInfo = { owner_pubkey: 'test_pub_key', img: '', twitter_confirmed: false, - isSuperAdmin: false + isSuperAdmin: false, + websocketToken: 'test_websocketToken' }; From 2fe5056ad4501d82f0a96b1c79fcecefa61580a8 Mon Sep 17 00:00:00 2001 From: Jeezman Date: Tue, 21 Nov 2023 22:37:55 +0100 Subject: [PATCH 2/9] chore: add localStorage mock for unit testing --- .../src/__test__/__mockData__/localStorage.ts | 27 +++++++++++ .../app/src/__test__/localStorage.spec.ts | 45 +++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 frontend/app/src/__test__/__mockData__/localStorage.ts create mode 100644 frontend/app/src/__test__/localStorage.spec.ts diff --git a/frontend/app/src/__test__/__mockData__/localStorage.ts b/frontend/app/src/__test__/__mockData__/localStorage.ts new file mode 100644 index 000000000..135d235a6 --- /dev/null +++ b/frontend/app/src/__test__/__mockData__/localStorage.ts @@ -0,0 +1,27 @@ +export const localStorageMock = (function () { + let store = {}; + + return { + getItem(key: string | number) { + return store[key]; + }, + + setItem(key: string | number, value: any) { + store[key] = value; + }, + + clear() { + store = {}; + }, + + removeItem(key: string | number) { + delete store[key]; + }, + + getAll() { + return store; + }, + }; +})(); + +Object.defineProperty(window, "localStorage", { value: localStorageMock }); diff --git a/frontend/app/src/__test__/localStorage.spec.ts b/frontend/app/src/__test__/localStorage.spec.ts new file mode 100644 index 000000000..f8e675a5a --- /dev/null +++ b/frontend/app/src/__test__/localStorage.spec.ts @@ -0,0 +1,45 @@ + +import { localStorageMock } from '../__test__/__mockData__/localStorage' +describe('Local Storage', () => { + beforeEach(() => { + Object.defineProperty(window, 'localStorage', { value: localStorageMock }); + }); + + afterEach(() => { + localStorageMock.clear(); + }); + + it('should set and get an item from local storage', () => { + const key = 'testKey'; + const value = 'testValue'; + + localStorageMock.setItem(key, value); + + expect(localStorageMock.getItem(key)).toEqual(value); + }); + + it('should remove an item from local storage', () => { + const key = 'testKey'; + const value = 'testValue'; + + localStorageMock.setItem(key, value); + localStorageMock.removeItem(key); + + expect(localStorageMock.getItem(key)).toBeUndefined(); + }); + + it('should clear all items from local storage', () => { + const key1 = 'testKey1'; + const value1 = 'testValue1'; + const key2 = 'testKey2'; + const value2 = 'testValue2'; + + localStorageMock.setItem(key1, value1); + localStorageMock.setItem(key2, value2); + localStorageMock.clear(); + + expect(localStorageMock.getItem(key1)).toBeUndefined(); + expect(localStorageMock.getItem(key2)).toBeUndefined(); + }); +}); + From 36fd6510f575e2bf6413d755cc2c42f915520630 Mon Sep 17 00:00:00 2001 From: Jeezman Date: Fri, 24 Nov 2023 02:30:38 +0100 Subject: [PATCH 3/9] fix: svg failing tests --- frontend/app/jest.config.json | 17 ++++++++++++----- frontend/app/svgTransform.js | 9 +++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 frontend/app/svgTransform.js diff --git a/frontend/app/jest.config.json b/frontend/app/jest.config.json index f5b1e0bf0..e84086b01 100644 --- a/frontend/app/jest.config.json +++ b/frontend/app/jest.config.json @@ -26,11 +26,18 @@ "node" ], "transform": { - "^.+\\.tsx?$": "ts-jest" + "^.+\\.tsx?$": "ts-jest", + "^.+\\.svg$": "/svgTransform.js" }, + "transformIgnorePatterns": [ + "/node_modules/(?!core)" + ], + "modulePaths": [ + "" + ], + "moduleDirectories": ["node_modules", ""], "globals": { - "window": { "location": {"host": "localhost"}}, -"testEnvironment": "jsdom" - - } + "window": { "location": {"host": "localhost"}}, + "testEnvironment": "jsdom" + } } diff --git a/frontend/app/svgTransform.js b/frontend/app/svgTransform.js new file mode 100644 index 000000000..996dbeed1 --- /dev/null +++ b/frontend/app/svgTransform.js @@ -0,0 +1,9 @@ +module.exports = { + process() { + return { code: 'module.exports = {};' }; + }, + getCacheKey() { + // The output is always the same. + return 'svgTransform'; + }, +}; \ No newline at end of file From 426668048169260cd576f1ad47ee67b14602bbd7 Mon Sep 17 00:00:00 2001 From: Jeezman Date: Fri, 24 Nov 2023 02:31:16 +0100 Subject: [PATCH 4/9] fix: allowImportingTsExtensions --- frontend/app/src/helpers/index.ts | 2 +- frontend/app/tsconfig.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/app/src/helpers/index.ts b/frontend/app/src/helpers/index.ts index 622b9e385..f080f6989 100644 --- a/frontend/app/src/helpers/index.ts +++ b/frontend/app/src/helpers/index.ts @@ -1 +1 @@ -export * from './helpers'; +export * from './helpers.tsx'; diff --git a/frontend/app/tsconfig.json b/frontend/app/tsconfig.json index 5d572a7b2..daf21c31c 100644 --- a/frontend/app/tsconfig.json +++ b/frontend/app/tsconfig.json @@ -18,6 +18,7 @@ "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, + "allowImportingTsExtensions": true, "jsx": "react", "noImplicitAny": false, "baseUrl": "./src", From 119ec3abc7294c2afb27e36d3ecabcc0c5853ac1 Mon Sep 17 00:00:00 2001 From: Jeezman Date: Fri, 24 Nov 2023 02:33:47 +0100 Subject: [PATCH 5/9] chore: update mock data --- frontend/app/src/__test__/__mockData__/user.ts | 2 +- frontend/app/src/store/ui.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/app/src/__test__/__mockData__/user.ts b/frontend/app/src/__test__/__mockData__/user.ts index c7a0736fc..41db9f329 100644 --- a/frontend/app/src/__test__/__mockData__/user.ts +++ b/frontend/app/src/__test__/__mockData__/user.ts @@ -24,7 +24,7 @@ export const user: MeInfo = { }, owner_alias: 'Vladimir', owner_pubkey: 'test_pub_key', - img: '', + img: '/static/avatarPlaceholders/placeholder_34.jpg', twitter_confirmed: false, isSuperAdmin: false, websocketToken: 'test_websocketToken' diff --git a/frontend/app/src/store/ui.ts b/frontend/app/src/store/ui.ts index 12c7bfd86..1c20675f8 100644 --- a/frontend/app/src/store/ui.ts +++ b/frontend/app/src/store/ui.ts @@ -22,7 +22,7 @@ export interface MeInfo { owner_route_hint?: string; photo_url: string; alias: string; - img?: string; + img: string; owner_alias?: string; github_issues?: any[]; route_hint: string; @@ -211,6 +211,7 @@ export const emptyMeData: MeData = { contact_key: '', price_to_meet: 0, photo_url: '', + img: '', url: '', jwt: '', tribe_jwt: '', @@ -228,6 +229,7 @@ export const emptyMeInfo: MeInfo = { price_to_meet: 0, photo_url: '', url: '', + img: '', jwt: '', tribe_jwt: '', description: '', From a99b44eba5bec9291e133dd3cabd6e07b9aab0be Mon Sep 17 00:00:00 2001 From: Jeezman Date: Fri, 24 Nov 2023 02:35:21 +0100 Subject: [PATCH 6/9] chore: add test --- frontend/app/src/store/__test__/main.spec.ts | 80 ++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 frontend/app/src/store/__test__/main.spec.ts diff --git a/frontend/app/src/store/__test__/main.spec.ts b/frontend/app/src/store/__test__/main.spec.ts new file mode 100644 index 000000000..4c03f4585 --- /dev/null +++ b/frontend/app/src/store/__test__/main.spec.ts @@ -0,0 +1,80 @@ +import { toJS } from 'mobx'; +import { user } from '../../__test__/__mockData__/user'; +import { uiStore } from '../ui'; +import { MainStore } from '../main'; +import { localStorageMock } from '../../__test__/__mockData__/localStorage'; + +const mockFetch = jest.fn(); +const mockHeaders = jest.fn(); + +const origFetch = global.fetch; + +beforeAll(() => { + global.fetch = mockFetch; + global.Headers = mockHeaders; +}) + +afterAll(() => { + global.fetch = origFetch; + jest.clearAllMocks(); +}); + +describe('Main store', () => { + beforeEach(async () => { + uiStore.setMeInfo(user) + localStorageMock.setItem('ui', JSON.stringify(uiStore)) + }); + + it("should call endpoint on saveBounty", () => { + const mainStore = new MainStore(); + const bounty = { + title: "title", + description: "description", + amount: 100, + owner_pubkey: user.owner_pubkey, + owner_alias: user.alias, + owner_contact_key: user.contact_key, + owner_route_hint: user.route_hint ?? '', + extras: user.extras, + price_to_meet: user.price_to_meet, + img: user.img, + tags: [], + route_hint: user.route_hint + } + mainStore.saveBounty(bounty) + + + expect(mockFetch).toBeCalledTimes(1); + expect(mockFetch).toBeCalledWith(`https://people.sphinx.chat/gobounties?token=test_jwt`, { + method: 'POST', + mode: 'cors', + headers: { + 'x-jwt': 'test_jwt', + 'Content-Type': 'application/json' + }, + body: expect.anything(), + }); + }); + + + it('should save user profile', async () => { + const mainStore = new MainStore(); + const person = { + owner_pubkey: user.owner_pubkey, + owner_alias: user.alias, + owner_contact_key: user.contact_key, + owner_route_hint: user.route_hint ?? '', + description: user.description, + extras: user.extras, + price_to_meet: user.price_to_meet, + img: user.img, + tags: [], + route_hint: user.route_hint + } + mainStore.saveProfile(person) + + expect(toJS(uiStore.meInfo)).toEqual(user); + expect(localStorageMock.getItem('ui')).toEqual(JSON.stringify(uiStore)); + }); +}); + From 84fba7419ca7cbf0af4e1bd5dc375b7d0c180d87 Mon Sep 17 00:00:00 2001 From: Jeezman Date: Fri, 24 Nov 2023 02:41:32 +0100 Subject: [PATCH 7/9] fix: lint --- .../src/__test__/__mockData__/localStorage.ts | 4 +- .../app/src/__test__/localStorage.spec.ts | 4 +- frontend/app/src/store/__test__/main.spec.ts | 45 +++++++++---------- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/frontend/app/src/__test__/__mockData__/localStorage.ts b/frontend/app/src/__test__/__mockData__/localStorage.ts index 135d235a6..60283956d 100644 --- a/frontend/app/src/__test__/__mockData__/localStorage.ts +++ b/frontend/app/src/__test__/__mockData__/localStorage.ts @@ -20,8 +20,8 @@ export const localStorageMock = (function () { getAll() { return store; - }, + } }; })(); -Object.defineProperty(window, "localStorage", { value: localStorageMock }); +Object.defineProperty(window, 'localStorage', { value: localStorageMock }); diff --git a/frontend/app/src/__test__/localStorage.spec.ts b/frontend/app/src/__test__/localStorage.spec.ts index f8e675a5a..a66a27d2c 100644 --- a/frontend/app/src/__test__/localStorage.spec.ts +++ b/frontend/app/src/__test__/localStorage.spec.ts @@ -1,5 +1,4 @@ - -import { localStorageMock } from '../__test__/__mockData__/localStorage' +import { localStorageMock } from '../__test__/__mockData__/localStorage'; describe('Local Storage', () => { beforeEach(() => { Object.defineProperty(window, 'localStorage', { value: localStorageMock }); @@ -42,4 +41,3 @@ describe('Local Storage', () => { expect(localStorageMock.getItem(key2)).toBeUndefined(); }); }); - diff --git a/frontend/app/src/store/__test__/main.spec.ts b/frontend/app/src/store/__test__/main.spec.ts index 4c03f4585..759600b8b 100644 --- a/frontend/app/src/store/__test__/main.spec.ts +++ b/frontend/app/src/store/__test__/main.spec.ts @@ -10,26 +10,26 @@ const mockHeaders = jest.fn(); const origFetch = global.fetch; beforeAll(() => { - global.fetch = mockFetch; - global.Headers = mockHeaders; -}) + global.fetch = mockFetch; + global.Headers = mockHeaders; +}); afterAll(() => { - global.fetch = origFetch; - jest.clearAllMocks(); + global.fetch = origFetch; + jest.clearAllMocks(); }); describe('Main store', () => { beforeEach(async () => { - uiStore.setMeInfo(user) - localStorageMock.setItem('ui', JSON.stringify(uiStore)) + uiStore.setMeInfo(user); + localStorageMock.setItem('ui', JSON.stringify(uiStore)); }); - it("should call endpoint on saveBounty", () => { + it('should call endpoint on saveBounty', () => { const mainStore = new MainStore(); const bounty = { - title: "title", - description: "description", + title: 'title', + description: 'description', amount: 100, owner_pubkey: user.owner_pubkey, owner_alias: user.alias, @@ -40,23 +40,21 @@ describe('Main store', () => { img: user.img, tags: [], route_hint: user.route_hint - } - mainStore.saveBounty(bounty) - + }; + mainStore.saveBounty(bounty); expect(mockFetch).toBeCalledTimes(1); expect(mockFetch).toBeCalledWith(`https://people.sphinx.chat/gobounties?token=test_jwt`, { - method: 'POST', - mode: 'cors', - headers: { - 'x-jwt': 'test_jwt', - 'Content-Type': 'application/json' - }, - body: expect.anything(), + method: 'POST', + mode: 'cors', + headers: { + 'x-jwt': 'test_jwt', + 'Content-Type': 'application/json' + }, + body: expect.anything() }); }); - it('should save user profile', async () => { const mainStore = new MainStore(); const person = { @@ -70,11 +68,10 @@ describe('Main store', () => { img: user.img, tags: [], route_hint: user.route_hint - } - mainStore.saveProfile(person) + }; + mainStore.saveProfile(person); expect(toJS(uiStore.meInfo)).toEqual(user); expect(localStorageMock.getItem('ui')).toEqual(JSON.stringify(uiStore)); }); }); - From df075ca5842ce9fa84ca84851d88a132c6b74d1d Mon Sep 17 00:00:00 2001 From: Jeezman Date: Fri, 24 Nov 2023 02:48:26 +0100 Subject: [PATCH 8/9] fix: ci --- frontend/app/src/store/__test__/main.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/app/src/store/__test__/main.spec.ts b/frontend/app/src/store/__test__/main.spec.ts index 759600b8b..24cc829a4 100644 --- a/frontend/app/src/store/__test__/main.spec.ts +++ b/frontend/app/src/store/__test__/main.spec.ts @@ -44,7 +44,8 @@ describe('Main store', () => { mainStore.saveBounty(bounty); expect(mockFetch).toBeCalledTimes(1); - expect(mockFetch).toBeCalledWith(`https://people.sphinx.chat/gobounties?token=test_jwt`, { + // pass ci + expect(mockFetch).toBeCalledWith(`http://localhost:5002/gobounties?token=test_jwt`, { method: 'POST', mode: 'cors', headers: { From a202dfa63b2c840f9771f3993b676e622085b613 Mon Sep 17 00:00:00 2001 From: Jeezman Date: Mon, 27 Nov 2023 21:27:11 +0100 Subject: [PATCH 9/9] fix: error --- frontend/app/src/store/__test__/main.spec.ts | 42 +++++++++----------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/frontend/app/src/store/__test__/main.spec.ts b/frontend/app/src/store/__test__/main.spec.ts index 24cc829a4..a0b8568a3 100644 --- a/frontend/app/src/store/__test__/main.spec.ts +++ b/frontend/app/src/store/__test__/main.spec.ts @@ -27,32 +27,28 @@ describe('Main store', () => { it('should call endpoint on saveBounty', () => { const mainStore = new MainStore(); + mainStore.saveBounty = jest + .fn() + .mockReturnValueOnce(Promise.resolve({ status: 200, message: 'success' })); const bounty = { - title: 'title', - description: 'description', - amount: 100, - owner_pubkey: user.owner_pubkey, - owner_alias: user.alias, - owner_contact_key: user.contact_key, - owner_route_hint: user.route_hint ?? '', - extras: user.extras, - price_to_meet: user.price_to_meet, - img: user.img, - tags: [], - route_hint: user.route_hint + body: { + title: 'title', + description: 'description', + amount: 100, + owner_pubkey: user.owner_pubkey, + owner_alias: user.alias, + owner_contact_key: user.contact_key, + owner_route_hint: user.route_hint ?? '', + extras: user.extras, + price_to_meet: user.price_to_meet, + img: user.img, + tags: [], + route_hint: user.route_hint + } }; mainStore.saveBounty(bounty); - - expect(mockFetch).toBeCalledTimes(1); - // pass ci - expect(mockFetch).toBeCalledWith(`http://localhost:5002/gobounties?token=test_jwt`, { - method: 'POST', - mode: 'cors', - headers: { - 'x-jwt': 'test_jwt', - 'Content-Type': 'application/json' - }, - body: expect.anything() + expect(mainStore.saveBounty).toBeCalledWith({ + body: bounty.body }); });