/** * @jest-environment jsdom */ import '@abraham/reflection' import { Injectable } from '@sigi/di' import { render as testRender } from '@testing-library/react' import { InjectionProvidersContext, useInstance } from '../injectable-context' function render(component: React.ReactElement) { return testRender({component}) } function inject() { @Injectable() class Service {} @Injectable() class Module { constructor(public readonly service: Service) {} } return { Module, Service } } describe('Context specs', () => { it('should getInstance', () => { const { Module, Service } = inject() const TestComponent = () => { const instance = useInstance(Module) expect(instance.service instanceof Service).toBeTruthy() return
} render() }) it('should override provider', () => { const { Module, Service } = inject() const mockService = { provide: Service, useValue: 1, } const TestComponent = () => { const instance = useInstance(Module) expect(instance.service).toBe(mockService.useValue) return
} render( , ) }) it('Multi providers context', () => { const { Module, Service } = inject() const mockService1 = { provide: Service, useValue: 1, } const mockService2 = { provide: Service, useValue: 2, } const TestComponent1 = () => { const instance = useInstance(Module) expect(instance.service).toBe(mockService1.useValue) return
} const TestComponent2 = () => { const instance = useInstance(Module) expect(mockService2.useValue).toBe(instance.service) return
} render( <> , ) }) it('Nested providers', () => { const { Module, Service } = inject() const mockService1 = { provide: Service, useValue: 1, } const mockService2 = { provide: Service, useValue: 2, } // eslint-disable-next-line sonarjs/no-identical-functions const TestComponent1 = () => { const instance = useInstance(Module) expect(instance.service).toBe(mockService1.useValue) return
} const TestComponent2 = () => { const instance = useInstance(Module) expect(instance.service).toBe(mockService2.useValue) return
} render( <> , ) }) })