Skip to content

Commit 50ccb2e

Browse files
committed
chore: Add more test coverage
1 parent ae64795 commit 50ccb2e

5 files changed

Lines changed: 1051 additions & 0 deletions

File tree

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
import {
2+
createRepairGroupFormState,
3+
getRepairGroupContext,
4+
isRepairGroupValid,
5+
} from '@/pages/rec-resource-page/components/RecResourceAssetsSection/RepairAssetEntry';
6+
import type {
7+
Asset,
8+
AssetCode,
9+
} from '@/pages/rec-resource-page/components/RecResourceAssetsSection/types';
10+
import { describe, expect, it } from 'vitest';
11+
12+
const baseAsset: Asset = {
13+
asset_id: 0,
14+
parent_id: null,
15+
rec_resource_id: 'REC0001',
16+
asset_code: 0,
17+
asset_name: null,
18+
asset_tag: null,
19+
asset_comment: null,
20+
legacy_structure_id: null,
21+
asset_length: null,
22+
asset_width: null,
23+
asset_area: null,
24+
default_value: null,
25+
actual_value: null,
26+
installation_date: null,
27+
updated_by: null,
28+
updated_at: null,
29+
geometry_type_code: null,
30+
latitude: null,
31+
longitude: null,
32+
recreation_asset_repair: null,
33+
};
34+
35+
const assetCodes: AssetCode[] = [
36+
{ asset_code: 1, description: 'Picnic table' },
37+
{ asset_code: 2, description: 'Trail' },
38+
];
39+
40+
describe('createRepairGroupFormState', () => {
41+
it('returns an empty group with the given id', () => {
42+
expect(createRepairGroupFormState(3)).toEqual({
43+
id: 3,
44+
assetTypeCode: '',
45+
selectedAssetIds: [],
46+
estimatedCost: undefined,
47+
actualCost: undefined,
48+
trailStations: {},
49+
});
50+
});
51+
});
52+
53+
describe('getRepairGroupContext', () => {
54+
it('returns no matching assets when no asset type is selected', () => {
55+
const context = getRepairGroupContext(
56+
createRepairGroupFormState(0),
57+
[{ ...baseAsset, asset_id: 1, asset_code: 1 }],
58+
assetCodes,
59+
);
60+
61+
expect(context.matchingAssets).toEqual([]);
62+
expect(context.selectedAssets).toEqual([]);
63+
expect(context.isTrailAssetType).toBe(false);
64+
});
65+
66+
it('sorts matching assets alphabetically by name', () => {
67+
const assets: Asset[] = [
68+
{ ...baseAsset, asset_id: 1, asset_code: 1, asset_name: 'B table' },
69+
{ ...baseAsset, asset_id: 2, asset_code: 1, asset_name: 'A table' },
70+
];
71+
const entry = { ...createRepairGroupFormState(0), assetTypeCode: '1' };
72+
73+
const context = getRepairGroupContext(entry, assets, assetCodes);
74+
75+
expect(context.matchingAssets.map((a) => a.asset_id)).toEqual([2, 1]);
76+
});
77+
78+
it('returns only the selected subset as selectedAssets', () => {
79+
const assets: Asset[] = [
80+
{ ...baseAsset, asset_id: 1, asset_code: 1, asset_name: 'Table 1' },
81+
{ ...baseAsset, asset_id: 2, asset_code: 1, asset_name: 'Table 2' },
82+
];
83+
const entry = {
84+
...createRepairGroupFormState(0),
85+
assetTypeCode: '1',
86+
selectedAssetIds: [2],
87+
};
88+
89+
const context = getRepairGroupContext(entry, assets, assetCodes);
90+
91+
expect(context.selectedAssets.map((a) => a.asset_id)).toEqual([2]);
92+
});
93+
94+
it('identifies trail asset types by description', () => {
95+
const entry = { ...createRepairGroupFormState(0), assetTypeCode: '2' };
96+
97+
const context = getRepairGroupContext(entry, [], assetCodes);
98+
99+
expect(context.isTrailAssetType).toBe(true);
100+
});
101+
102+
it('treats non-trail descriptions as not a trail asset type', () => {
103+
const entry = { ...createRepairGroupFormState(0), assetTypeCode: '1' };
104+
105+
const context = getRepairGroupContext(entry, [], assetCodes);
106+
107+
expect(context.isTrailAssetType).toBe(false);
108+
});
109+
});
110+
111+
describe('isRepairGroupValid', () => {
112+
it('is valid when no asset type has been selected yet', () => {
113+
expect(isRepairGroupValid(createRepairGroupFormState(0), [], [])).toBe(
114+
true,
115+
);
116+
});
117+
118+
it('is invalid when no assets are selected', () => {
119+
const entry = { ...createRepairGroupFormState(0), assetTypeCode: '1' };
120+
121+
expect(isRepairGroupValid(entry, [], assetCodes)).toBe(false);
122+
});
123+
124+
it('is invalid when estimated cost is missing', () => {
125+
const assets: Asset[] = [
126+
{ ...baseAsset, asset_id: 1, asset_code: 1, asset_name: 'Table 1' },
127+
];
128+
const entry = {
129+
...createRepairGroupFormState(0),
130+
assetTypeCode: '1',
131+
selectedAssetIds: [1],
132+
estimatedCost: undefined,
133+
};
134+
135+
expect(isRepairGroupValid(entry, assets, assetCodes)).toBe(false);
136+
});
137+
138+
it('is valid for a non-trail group with assets selected and a cost', () => {
139+
const assets: Asset[] = [
140+
{ ...baseAsset, asset_id: 1, asset_code: 1, asset_name: 'Table 1' },
141+
];
142+
const entry = {
143+
...createRepairGroupFormState(0),
144+
assetTypeCode: '1',
145+
selectedAssetIds: [1],
146+
estimatedCost: 50,
147+
};
148+
149+
expect(isRepairGroupValid(entry, assets, assetCodes)).toBe(true);
150+
});
151+
152+
it('is valid for a trail group when all stations are well-formed', () => {
153+
const assets: Asset[] = [
154+
{ ...baseAsset, asset_id: 1, asset_code: 2, asset_name: 'Trail A' },
155+
];
156+
const entry = {
157+
...createRepairGroupFormState(0),
158+
assetTypeCode: '2',
159+
selectedAssetIds: [1],
160+
estimatedCost: 50,
161+
trailStations: {
162+
1: { startStation: '49.1,-128.1', endStation: '49.2,-128.2' },
163+
},
164+
};
165+
166+
expect(isRepairGroupValid(entry, assets, assetCodes)).toBe(true);
167+
});
168+
169+
it('is valid for a trail group when stations are left blank', () => {
170+
const assets: Asset[] = [
171+
{ ...baseAsset, asset_id: 1, asset_code: 2, asset_name: 'Trail A' },
172+
];
173+
const entry = {
174+
...createRepairGroupFormState(0),
175+
assetTypeCode: '2',
176+
selectedAssetIds: [1],
177+
estimatedCost: 50,
178+
};
179+
180+
expect(isRepairGroupValid(entry, assets, assetCodes)).toBe(true);
181+
});
182+
183+
it('is invalid for a trail group when a station is malformed', () => {
184+
const assets: Asset[] = [
185+
{ ...baseAsset, asset_id: 1, asset_code: 2, asset_name: 'Trail A' },
186+
];
187+
const entry = {
188+
...createRepairGroupFormState(0),
189+
assetTypeCode: '2',
190+
selectedAssetIds: [1],
191+
estimatedCost: 50,
192+
trailStations: {
193+
1: { startStation: 'not-a-coordinate', endStation: '' },
194+
},
195+
};
196+
197+
expect(isRepairGroupValid(entry, assets, assetCodes)).toBe(false);
198+
});
199+
});

0 commit comments

Comments
 (0)