UNPKG

@furystack/auth-google

Version:

Google Authentication Provider for FuryStack

108 lines 5.21 kB
import { InMemoryStore, StoreManager, User, addStore } from '@furystack/core'; import { Injector } from '@furystack/inject'; import { useHttpAuthentication } from '@furystack/rest-service'; import { usingAsync } from '@furystack/utils'; import { describe, expect, it } from 'vitest'; import { GoogleLoginService, GoogleLoginSettings } from './login-service.js'; const getGoogleUser = (overrides) => ({ email: 'user@example.com', email_verified: true, ...overrides, }); describe('Google Login Service', () => { describe('Settings', () => { it('Can parse the user from the Google Response post body', async () => { await usingAsync(new Injector(), async (i) => { addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })); useHttpAuthentication(i, { getUserStore: (sm) => sm.getStoreFor(User, 'username'), }); await i.getInstance(StoreManager).getStoreFor(User, 'username').add({ username: 'user@example.com', roles: [] }); const user = await i.getInstance(GoogleLoginSettings).getUserFromGooglePayload(getGoogleUser()); expect(user && user.roles).toEqual([]); }); }); }); describe('Service', () => { it('Can be constructed', async () => { await usingAsync(new Injector(), async (i) => { expect(i.getInstance(GoogleLoginService)).toBeInstanceOf(GoogleLoginService); }); }); it('Should reject on invalide Google API responses', async () => { await usingAsync(new Injector(), async (i) => { addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })); useHttpAuthentication(i, { getUserStore: (sm) => sm.getStoreFor(User, 'username'), }); const loginService = i.getInstance(GoogleLoginService); loginService.readPostBody = async () => getGoogleUser({ email_verified: false, }); i.getInstance(GoogleLoginSettings).get = ((_options, done) => { done({ statusCode: 404, }); }); await expect(loginService.login('')).rejects.toThrow(); }); }); it('Should reject if the user is not in the DB', async () => { await usingAsync(new Injector(), async (i) => { addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })); useHttpAuthentication(i, { getUserStore: (sm) => sm.getStoreFor(User, 'username'), }); const loginService = i.getInstance(GoogleLoginService); loginService.readPostBody = async () => getGoogleUser(); i.getInstance(GoogleLoginSettings).get = ((_options, done) => { done({ statusCode: 200, }); }); await expect(loginService.login('')).rejects.toThrow(); }); }); it('Should reject on unverified e-mail addresses', async () => { await usingAsync(new Injector(), async (i) => { addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })); useHttpAuthentication(i, { getUserStore: (sm) => sm.getStoreFor(User, 'username'), }); const loginService = i.getInstance(GoogleLoginService); loginService.readPostBody = () => getGoogleUser({ email_verified: false, }); i.getInstance(GoogleLoginSettings).get = ((_options, done) => { done({ statusCode: 200, }); }); await expect(loginService.login('token')).rejects.toThrow(); }); }); it('Should login the user on valid Google Payload response ', async () => { await usingAsync(new Injector(), async (i) => { addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })); useHttpAuthentication(i, { getUserStore: (sm) => sm.getStoreFor(User, 'username'), }); const usr = { username: 'user@example.com', roles: [] }; await i.getInstance(StoreManager).getStoreFor(User, 'username').add(usr); const loginService = i.getInstance(GoogleLoginService); loginService.readPostBody = async () => ({ email: 'user@example.com', email_verified: true, }); i.getInstance(GoogleLoginSettings).get = ((_options, done) => { done({ statusCode: 200, }); }); const user = await loginService.login('token'); expect(user).toEqual(usr); }); }); }); }); //# sourceMappingURL=google-login-service.spec.js.map