UNPKG

@furystack/shades

Version:

Google Authentication Provider for FuryStack

103 lines (89 loc) 3.26 kB
import { ObservableValue, usingAsync } from '@furystack/utils' import { describe, expect, it, vi } from 'vitest' import { ResourceManager } from './resource-manager.js' describe('ResourceManager', () => { it('Should return an observable from cache', async () => { await usingAsync(new ResourceManager(), async (rm) => { const o = new ObservableValue(1) const [value1] = rm.useObservable('test', o, () => { /** ignore */ }) const [value2] = rm.useObservable('test', o, () => { /** ignore */ }) expect(value1).toBe(value2) expect(o.getObservers().length).toBe(1) }) }) it('Should return a disposable from cache', async () => { await usingAsync(new ResourceManager(), async (rm) => { const factory = vi.fn(() => ({ [Symbol.dispose]: () => { /** ignore */ }, })) const d1 = rm.useDisposable('test', factory) const d2 = rm.useDisposable('test', factory) expect(d1).toBe(d2) expect(factory).toHaveBeenCalledTimes(1) }) }) it('Should dispose all disposables on dispose', async () => { const disposable = { [Symbol.dispose]: vi.fn(), } const factory = vi.fn(() => disposable) await usingAsync(new ResourceManager(), async (rm) => { rm.useDisposable('test', factory) expect(factory).toHaveBeenCalledTimes(1) }) expect(disposable[Symbol.dispose]).toHaveBeenCalledTimes(1) }) it('Should dispose all async disposables on dispose', async () => { const disposable = { [Symbol.asyncDispose]: vi.fn(), } const factory = vi.fn(() => disposable) await usingAsync(new ResourceManager(), async (rm) => { rm.useDisposable('test', factory) expect(factory).toHaveBeenCalledTimes(1) }) expect(disposable[Symbol.asyncDispose]).toHaveBeenCalledTimes(1) }) it('Should throw an aggregated error when failed to dispose something', async () => { const disposable = { [Symbol.dispose]: vi.fn(() => { throw new Error('Failed to dispose') }), } const factory = vi.fn(() => disposable) await expect( async () => await usingAsync(new ResourceManager(), async (rm) => { rm.useDisposable('test', factory) expect(factory).toHaveBeenCalledTimes(1) }), ).rejects.toThrowErrorMatchingInlineSnapshot( `[Error: There was an error during disposing 1 stores: Error: Failed to dispose]`, ) expect(disposable[Symbol.dispose]).toHaveBeenCalledTimes(1) }) it('Should throw an aggregated error when failed to async dispose something', async () => { const disposable = { [Symbol.asyncDispose]: vi.fn(async () => { throw new Error('Failed to dispose') }), } const factory = vi.fn(() => disposable) await expect( async () => await usingAsync(new ResourceManager(), async (rm) => { rm.useDisposable('test', factory) expect(factory).toHaveBeenCalledTimes(1) }), ).rejects.toThrowErrorMatchingInlineSnapshot( `[Error: There was an error during disposing 1 stores: Error: Failed to dispose]`, ) expect(disposable[Symbol.asyncDispose]).toHaveBeenCalledTimes(1) }) })