@furystack/auth-google
Version:
Google Authentication Provider for FuryStack
108 lines • 5.21 kB
JavaScript
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