Skip to content

Commit d8a2389

Browse files
committed
test(unit): add coverage for updated package resolver
1 parent f38a077 commit d8a2389

2 files changed

Lines changed: 125 additions & 0 deletions

File tree

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import type { DependencyInjectionAdapter } from '@suites/types.di';
2+
import { PackageResolver, type PackageResolverStrategy } from '../src/package-resolver.base';
3+
4+
describe('PackageResolver Unit Spec', () => {
5+
describe('resolveCorrespondingAdapter', () => {
6+
describe('when strategy finds a matching adapter', () => {
7+
let packageResolver: PackageResolver<DependencyInjectionAdapter>;
8+
let mockStrategy: jest.Mock<boolean, [string]>;
9+
10+
beforeEach(() => {
11+
mockStrategy = jest.fn((path: string) => path.includes('test-adapter'));
12+
packageResolver = new PackageResolver<DependencyInjectionAdapter>(
13+
{ test: __dirname + '/assets/test-adapter' },
14+
mockStrategy
15+
);
16+
});
17+
18+
it('should call the strategy with the adapter path', async () => {
19+
await packageResolver.resolveCorrespondingAdapter();
20+
expect(mockStrategy).toHaveBeenCalledWith(__dirname + '/assets/test-adapter');
21+
});
22+
23+
it('should successfully resolve the adapter', async () => {
24+
const adapter = await packageResolver.resolveCorrespondingAdapter();
25+
expect(adapter.inspect({} as never)).toBe('success');
26+
});
27+
});
28+
29+
describe('when strategy returns false for all adapters', () => {
30+
let packageResolver: PackageResolver<DependencyInjectionAdapter>;
31+
let mockStrategy: PackageResolverStrategy;
32+
33+
beforeEach(() => {
34+
mockStrategy = jest.fn().mockReturnValue(false);
35+
packageResolver = new PackageResolver<DependencyInjectionAdapter>(
36+
{
37+
adapter1: 'package-1',
38+
adapter2: 'package-2',
39+
},
40+
mockStrategy
41+
);
42+
});
43+
44+
it('should throw "Adapter not found" error', async () => {
45+
await expect(packageResolver.resolveCorrespondingAdapter()).rejects.toThrow(
46+
'Adapter not found'
47+
);
48+
});
49+
50+
it('should call strategy for each adapter', async () => {
51+
try {
52+
await packageResolver.resolveCorrespondingAdapter();
53+
} catch {
54+
// Expected to throw
55+
}
56+
expect(mockStrategy).toHaveBeenCalledWith('package-1');
57+
expect(mockStrategy).toHaveBeenCalledWith('package-2');
58+
});
59+
});
60+
61+
describe('when adapter module has no "adapter" export', () => {
62+
let packageResolver: PackageResolver<DependencyInjectionAdapter>;
63+
64+
beforeEach(() => {
65+
const mockStrategy = jest.fn().mockReturnValue(true);
66+
packageResolver = new PackageResolver<DependencyInjectionAdapter>(
67+
{ invalid: __dirname + '/assets/invalid-adapter' },
68+
mockStrategy
69+
);
70+
});
71+
72+
it('should throw "Adapter has no export" error', async () => {
73+
await expect(packageResolver.resolveCorrespondingAdapter()).rejects.toThrow(
74+
'Adapter has no export'
75+
);
76+
});
77+
});
78+
79+
describe('when multiple adapters are configured', () => {
80+
let packageResolver: PackageResolver<DependencyInjectionAdapter>;
81+
let mockStrategy: jest.Mock<boolean, [string]>;
82+
83+
beforeEach(() => {
84+
// Strategy only returns true for the second adapter
85+
mockStrategy = jest.fn((path: string) => path === __dirname + '/assets/test-adapter');
86+
packageResolver = new PackageResolver<DependencyInjectionAdapter>(
87+
{
88+
nonexistent: 'nonexistent-package',
89+
test: __dirname + '/assets/test-adapter',
90+
another: 'another-nonexistent',
91+
},
92+
mockStrategy
93+
);
94+
});
95+
96+
it('should resolve the first matching adapter', async () => {
97+
const adapter = await packageResolver.resolveCorrespondingAdapter();
98+
expect(adapter.inspect({} as never)).toBe('success');
99+
});
100+
101+
it('should stop checking once a match is found', async () => {
102+
await packageResolver.resolveCorrespondingAdapter();
103+
// Strategy is called with find(), which stops at first match
104+
// The calls depend on object key iteration order
105+
expect(mockStrategy).toHaveBeenCalled();
106+
});
107+
});
108+
109+
describe('when adapters object is empty', () => {
110+
let packageResolver: PackageResolver<DependencyInjectionAdapter>;
111+
112+
beforeEach(() => {
113+
const mockStrategy = jest.fn().mockReturnValue(true);
114+
packageResolver = new PackageResolver<DependencyInjectionAdapter>({}, mockStrategy);
115+
});
116+
117+
it('should throw "Adapter not found" error', async () => {
118+
await expect(packageResolver.resolveCorrespondingAdapter()).rejects.toThrow(
119+
'Adapter not found'
120+
);
121+
});
122+
});
123+
});
124+
});

packages/unit/jest.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const config: Config = {
1212
'test-adapter.ts',
1313
'testbed.ts',
1414
'types.ts',
15+
'package-resolver.esm.ts',
1516
],
1617
};
1718

0 commit comments

Comments
 (0)