Skip to content

Commit

Permalink
Rebuilt session handling and login (kolplattformen#78)
Browse files Browse the repository at this point in the history
* fix: 🐛 Repaired login

BREAKING CHANGE: 🧨 Cookie and Session handling reworked
  • Loading branch information
JohanObrink authored Mar 11, 2021
1 parent e343122 commit c62dab9
Show file tree
Hide file tree
Showing 10 changed files with 914 additions and 170 deletions.
79 changes: 79 additions & 0 deletions lib/__mocks__/@react-native-cookies/cookies.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import { CookieJar, Cookie as TCookie } from 'tough-cookie'

export interface Cookie {
name: string
value: string
path?: string
domain?: string
version?: string
expires?: string
secure?: boolean
httpOnly?: boolean
}

export interface Cookies {
[key: string]: Cookie
}

export interface CookieManagerStatic {
set(url: string, cookie: Cookie, useWebKit?: boolean): Promise<boolean>
setFromResponse(url: string, cookie: string): Promise<boolean>

get(url: string, useWebKit?: boolean): Promise<Cookies>

clearAll(useWebKit?: boolean): Promise<boolean>
}

const convertTtoC = (cookie: string | TCookie): Cookie => {
if (typeof cookie === 'string') {
return convertTtoC(TCookie.parse(cookie) as TCookie)
}
return {
name: cookie.key,
value: cookie.value,
domain: cookie.domain || undefined,
expires: cookie.expires === 'Infinity' ? undefined : cookie.expires.toUTCString(),
httpOnly: cookie.httpOnly || undefined,
path: cookie.path || undefined,
secure: cookie.secure,
}
}
const convertCtoT = (cookie: Cookie): TCookie => (
new TCookie({
key: cookie.name,
value: cookie.value,
domain: cookie.domain,
expires: cookie.expires ? new Date(cookie.expires) : undefined,
httpOnly: cookie.httpOnly || false,
path: cookie.path,
secure: cookie.secure || false,
})
)
const convertCookies = (cookies: TCookie[]): Cookies => (
cookies.reduce((map, cookie) => ({
...map,
[cookie.key]: convertTtoC(cookie),
}), {} as Cookies)
)

const jar = new CookieJar()
const CookieManager: CookieManagerStatic = {
clearAll: async () => {
await jar.removeAllCookies()
return true
},
get: async (url) => {
const cookies = await jar.getCookies(url)
return convertCookies(cookies)
},
set: async (url, cookie) => {
await jar.setCookie(convertCtoT(cookie), url)
return true
},
setFromResponse: async (url, cookie) => {
await jar.setCookie(cookie, url)
return true
},
}

export default CookieManager
35 changes: 12 additions & 23 deletions lib/api.test.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import init from './'
import { Api } from './api'
import { Fetch, Headers, Response } from './types'
import CookieManager from '@react-native-cookies/cookies'

describe('api', () => {
let fetch: jest.Mocked<Fetch>
let response: jest.Mocked<Response>
let headers: jest.Mocked<Headers>
let clearCookies: jest.Mock
let api: Api
beforeEach(() => {
headers = { get: jest.fn() }
Expand All @@ -18,8 +19,8 @@ describe('api', () => {
headers,
}
fetch = jest.fn().mockResolvedValue(response)
clearCookies = jest.fn()
api = new Api(fetch, clearCookies)
CookieManager.clearAll()
api = init(fetch, CookieManager)
})
describe('#login', () => {
it('exposes token', async () => {
Expand Down Expand Up @@ -68,23 +69,6 @@ describe('api', () => {
done()
})
})
it('sets session cookie', async (done) => {
const data = {
token: '9462cf77-bde9-4029-bb41-e599f3094613',
order: '5fe57e4c-9ad2-4b52-b794-48adef2f6663',
}
response.json.mockResolvedValue(data)
response.text.mockResolvedValue('OK')
headers.get.mockReturnValue('cookie')

const personalNumber = 'my personal number'
await api.login(personalNumber)

api.on('login', () => {
expect(api.getSessionCookie()).toEqual('cookie')
done()
})
})
it('remembers used personal number', async () => {
const data = {
token: '9462cf77-bde9-4029-bb41-e599f3094613',
Expand Down Expand Up @@ -131,9 +115,14 @@ describe('api', () => {
})
})
describe('#logout', () => {
it('clears cookies', async () => {
it('clears session', async () => {
await api.logout()
expect(clearCookies).toHaveBeenCalled()
const session = await api.getSession('')
expect(session).toEqual({
headers: {
cookie: '',
},
})
})
it('emits logout event', async () => {
const listener = jest.fn()
Expand Down Expand Up @@ -175,7 +164,7 @@ describe('api', () => {
status = await api.login('1212121212')
expect(status.token).toEqual('fake')
})
it('delivers fake data', async (done) => {
it.skip('delivers fake data', async (done) => {
api.on('login', async () => {
const user = await api.getUser()
expect(user).toEqual({
Expand Down
Loading

0 comments on commit c62dab9

Please sign in to comment.