From a860d1208c5d79f0d06034ebd993bc1f3cf2eb5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20=C3=96brink?= Date: Mon, 18 Jan 2021 11:42:56 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Added=20getter=20for=20l?= =?UTF-8?q?ogged=20in=20personal=20number=20(#39)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/api.test.ts | 43 +++++++++++++++++++++++++++++++++++++++++++ lib/api.ts | 13 ++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/lib/api.test.ts b/lib/api.test.ts index 4583ff08..6b77e5d2 100644 --- a/lib/api.test.ts +++ b/lib/api.test.ts @@ -85,6 +85,34 @@ describe('api', () => { done() }) }) + it('remembers used personal number', async () => { + const data = { + token: '9462cf77-bde9-4029-bb41-e599f3094613', + order: '5fe57e4c-9ad2-4b52-b794-48adef2f6663', + } + response.json.mockResolvedValue(data) + + const personalNumber = 'my personal number' + await api.login(personalNumber) + + expect(api.getPersonalNumber()).toEqual(personalNumber) + }) + it('forgets used personal number if sign in is unsuccessful', async (done) => { + const data = { + token: '9462cf77-bde9-4029-bb41-e599f3094613', + order: '5fe57e4c-9ad2-4b52-b794-48adef2f6663', + } + response.json.mockResolvedValue(data) + response.text.mockResolvedValueOnce('ERROR') + + const personalNumber = 'my personal number' + const status = await api.login(personalNumber) + + status.on('ERROR', () => { + expect(api.getPersonalNumber()).toEqual(undefined) + done() + }) + }) }) describe('#logout', () => { it('clears cookies', async () => { @@ -102,6 +130,21 @@ describe('api', () => { await api.logout() expect(api.isLoggedIn).toBe(false) }) + it('forgets personalNumber', async () => { + const data = { + token: '9462cf77-bde9-4029-bb41-e599f3094613', + order: '5fe57e4c-9ad2-4b52-b794-48adef2f6663', + } + response.json.mockResolvedValue(data) + + const pnr = 'my personal number' + await api.login(pnr) + api.isLoggedIn = true + + await api.logout() + + expect(api.getPersonalNumber()).toEqual(undefined) + }) }) describe('fake', () => { it('sets fake mode for the correct pnr:s', async () => { diff --git a/lib/api.ts b/lib/api.ts index dadc5742..963d7a5e 100644 --- a/lib/api.ts +++ b/lib/api.ts @@ -25,6 +25,8 @@ import * as fake from './fakeData' export class Api extends EventEmitter { private fetch: Fetcher + private personalNumber?: string + private session?: RequestInit private clearCookies: AsyncishFunction @@ -39,6 +41,10 @@ export class Api extends EventEmitter { this.clearCookies = clearCookies } + getPersonalNumber() { + return this.personalNumber + } + getSessionCookie() { return this.session?.headers?.Cookie } @@ -63,6 +69,9 @@ export class Api extends EventEmitter { const ticketResponse = await this.fetch('auth-ticket', ticketUrl) const ticket: AuthTicket = await ticketResponse.json() + // login was initiated - store personal number + this.personalNumber = personalNumber + const status = checkStatus(this.fetch, ticket) status.on('OK', async () => { const cookieUrl = routes.loginCookie @@ -70,6 +79,7 @@ export class Api extends EventEmitter { const cookie = cookieResponse.headers.get('set-cookie') || '' this.setSessionCookie(cookie) }) + status.on('ERROR', () => { this.personalNumber = undefined }) return status } @@ -162,8 +172,9 @@ export class Api extends EventEmitter { async logout() { this.isFake = false this.session = undefined - await this.clearCookies() + this.personalNumber = undefined this.isLoggedIn = false + try { await this.clearCookies() } catch (_) { /* do nothing */ } this.emit('logout') } }