Skip to content

Commit ffa2c77

Browse files
committed
[CODE-100] Added additional tests for plan and utils
1 parent 114526b commit ffa2c77

5 files changed

Lines changed: 83 additions & 27 deletions

File tree

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "codify-plugin-lib",
3-
"version": "1.0.70",
3+
"version": "1.0.71",
44
"description": "",
55
"main": "dist/index.js",
66
"typings": "dist/index.d.ts",
@@ -14,7 +14,7 @@
1414
"dependencies": {
1515
"ajv": "^8.12.0",
1616
"ajv-formats": "^2.1.1",
17-
"codify-schemas": "1.0.38",
17+
"codify-schemas": "1.0.39",
1818
"@npmcli/promise-spawn": "^7.0.1"
1919
},
2020
"devDependencies": {

src/entities/plan.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,28 @@ describe('Plan entity tests', () => {
121121
.every((pc) => pc.operation === ParameterOperation.ADD)
122122
).to.be.true;
123123
})
124+
125+
it('Returns the original resource names', () => {
126+
const resource = createResource();
127+
128+
const plan = Plan.create(
129+
{
130+
propA: 'propA',
131+
},
132+
{
133+
propA: 'propA2',
134+
},
135+
{
136+
type: 'type',
137+
name: 'name1'
138+
}, { statefulMode: false });
139+
140+
expect(plan.toResponse()).toMatchObject({
141+
resourceType: 'type',
142+
resourceName: 'name1',
143+
operation: ResourceOperation.RECREATE
144+
})
145+
})
124146
})
125147

126148
function createResource(): Resource<any> {

src/entities/resource.ts

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1+
import Ajv from 'ajv';
2+
import Ajv2020, { ValidateFunction } from 'ajv/dist/2020.js';
13
import { ParameterOperation, ResourceConfig, ResourceOperation, StringIndexedObject, } from 'codify-schemas';
4+
5+
import { setsEqual, splitUserConfig } from '../utils/utils.js';
26
import { ParameterChange } from './change-set.js';
37
import { Plan } from './plan.js';
4-
import { StatefulParameter } from './stateful-parameter.js';
5-
import { ResourceParameterOptions, ValidationResult } from './resource-types.js';
6-
import { setsEqual, splitUserConfig } from '../utils/utils.js';
78
import { CreatePlan, DestroyPlan, ModifyPlan, ParameterOptions, PlanOptions } from './plan-types.js';
8-
import { TransformParameter } from './transform-parameter.js';
99
import { ResourceOptions, ResourceOptionsParser } from './resource-options.js';
10-
import Ajv from 'ajv';
11-
import Ajv2020, { ValidateFunction } from 'ajv/dist/2020.js';
10+
import { ResourceParameterOptions, ValidationResult } from './resource-types.js';
11+
import { StatefulParameter } from './stateful-parameter.js';
12+
import { TransformParameter } from './transform-parameter.js';
1213

1314
/**
1415
* Description of resource here
@@ -65,8 +66,8 @@ export abstract class Resource<T extends StringIndexedObject> {
6566

6667
if (!isValid) {
6768
return {
68-
isValid: false,
6969
errors: this.schemaValidator?.errors ?? [],
70+
isValid: false,
7071
}
7172
}
7273
}
@@ -84,8 +85,8 @@ export abstract class Resource<T extends StringIndexedObject> {
8485
this.validatePlanInputs(desiredConfig, currentConfig, statefulMode);
8586

8687
const planOptions: PlanOptions<T> = {
87-
statefulMode,
8888
parameterOptions: this.parameterOptions,
89+
statefulMode,
8990
}
9091

9192
this.addDefaultValues(desiredConfig);
@@ -95,8 +96,8 @@ export abstract class Resource<T extends StringIndexedObject> {
9596
const parsedConfig = new ConfigParser(desiredConfig, currentConfig, this.statefulParameters, this.transformParameters)
9697
const {
9798
desiredParameters,
98-
resourceMetadata,
9999
nonStatefulParameters,
100+
resourceMetadata,
100101
statefulParameters,
101102
} = parsedConfig;
102103

@@ -133,13 +134,16 @@ export abstract class Resource<T extends StringIndexedObject> {
133134
case ResourceOperation.CREATE: {
134135
return this._applyCreate(plan); // TODO: Add new parameters value so that apply
135136
}
137+
136138
case ResourceOperation.MODIFY: {
137139
return this._applyModify(plan);
138140
}
141+
139142
case ResourceOperation.RECREATE: {
140143
await this._applyDestroy(plan);
141144
return this._applyCreate(plan);
142145
}
146+
143147
case ResourceOperation.DESTROY: {
144148
return this._applyDestroy(plan);
145149
}
@@ -185,11 +189,13 @@ export abstract class Resource<T extends StringIndexedObject> {
185189
await statefulParameter.applyAdd(parameterChange.newValue, plan);
186190
break;
187191
}
192+
188193
case ParameterOperation.MODIFY: {
189194
// TODO: When stateful mode is added in the future. Dynamically choose if deletes are allowed
190195
await statefulParameter.applyModify(parameterChange.newValue, parameterChange.previousValue, false, plan);
191196
break;
192197
}
198+
193199
case ParameterOperation.REMOVE: {
194200
await statefulParameter.applyRemove(parameterChange.previousValue, plan);
195201
break;
@@ -256,10 +262,10 @@ Additional: ${[...refreshKeys].filter(k => !desiredKeys.has(k))};`
256262
delete desired[key];
257263

258264
// Add the new transformed values
259-
Object.entries(transformedValue).forEach(([tvKey, tvValue]) => {
265+
for (const [tvKey, tvValue] of Object.entries(transformedValue)) {
260266
// @ts-ignore
261267
desired[tvKey] = tvValue;
262-
})
268+
}
263269
}
264270
}
265271

@@ -268,13 +274,12 @@ Additional: ${[...refreshKeys].filter(k => !desiredKeys.has(k))};`
268274
return;
269275
}
270276

271-
Object.entries(this.defaultValues)
272-
.forEach(([key, defaultValue]) => {
277+
for (const [key, defaultValue] of Object.entries(this.defaultValues)) {
273278
if (defaultValue !== undefined && desired[key as any] === undefined) {
274279
// @ts-ignore
275280
desired[key] = defaultValue;
276281
}
277-
});
282+
}
278283
}
279284

280285
private async refreshNonStatefulParameters(resourceParameters: Partial<T>): Promise<Partial<T> | null> {
@@ -407,22 +412,22 @@ ${JSON.stringify(currentMetadata, null, 2)}`);
407412
const desiredParameters = this.desiredConfig ? splitUserConfig(this.desiredConfig).parameters : undefined;
408413
const currentParameters = this.currentConfig ? splitUserConfig(this.currentConfig).parameters : undefined;
409414

410-
return { ...(desiredParameters ?? {}), ...(currentParameters ?? {}) } as Partial<T>;
415+
return { ...desiredParameters, ...currentParameters } as Partial<T>;
411416
}
412417

413418
get nonStatefulParameters(): Partial<T> {
414-
const parameters = this.parameters;
419+
const { parameters } = this;
415420

416-
return Object.fromEntries([
417-
...Object.entries(parameters).filter(([key]) => !(this.statefulParametersMap.has(key) || this.transformParametersMap.has(key))),
418-
]) as Partial<T>;
421+
return Object.fromEntries(
422+
Object.entries(parameters).filter(([key]) => !(this.statefulParametersMap.has(key) || this.transformParametersMap.has(key)))
423+
) as Partial<T>;
419424
}
420425

421426
get statefulParameters(): Partial<T> {
422-
const parameters = this.parameters;
427+
const { parameters } = this;
423428

424-
return Object.fromEntries([
425-
...Object.entries(parameters).filter(([key]) => this.statefulParametersMap.has(key)),
426-
]) as Partial<T>;
429+
return Object.fromEntries(
430+
Object.entries(parameters).filter(([key]) => this.statefulParametersMap.has(key))
431+
) as Partial<T>;
427432
}
428433
}

src/utils/utils.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { describe, expect, it } from 'vitest';
2+
import { splitUserConfig } from './utils.js';
3+
4+
describe('Utils tests', () => {
5+
it('Can split a config correctly', () => {
6+
const { parameters, resourceMetadata } = splitUserConfig({
7+
type: 'type',
8+
name: 'name',
9+
dependsOn: ['a', 'b', 'c'],
10+
propA: 'propA',
11+
propB: 'propB',
12+
propC: 'propC',
13+
propD: 'propD',
14+
})
15+
16+
expect(resourceMetadata).toMatchObject({
17+
type: 'type',
18+
name: 'name',
19+
dependsOn: ['a', 'b', 'c'],
20+
})
21+
22+
expect(parameters).toMatchObject({
23+
propA: 'propA',
24+
propB: 'propB',
25+
propC: 'propC',
26+
propD: 'propD',
27+
})
28+
})
29+
})

src/utils/utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ export function splitUserConfig<T extends StringIndexedObject>(
8585
): { parameters: T; resourceMetadata: ResourceConfig} {
8686
const resourceMetadata = {
8787
type: config.type,
88-
...(config.name && { name: config.name }),
89-
...(config.dependsOn && { dependsOn: config.dependsOn }),
88+
...(config.name ? { name: config.name } : {}),
89+
...(config.dependsOn ? { dependsOn: config.dependsOn } : {}),
9090
};
9191

9292
const { type, name, dependsOn, ...parameters } = config;

0 commit comments

Comments
 (0)