@quadnix/octo 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/package.json +6 -1
  2. package/.eslintrc.cjs +0 -26
  3. package/dist/tsconfig.build.tsbuildinfo +0 -1
  4. package/src/app.type.ts +0 -56
  5. package/src/decorators/action.decorator.spec.ts +0 -43
  6. package/src/decorators/action.decorator.ts +0 -24
  7. package/src/decorators/anchor.decorator.ts +0 -10
  8. package/src/decorators/container.spec.ts +0 -104
  9. package/src/decorators/container.ts +0 -133
  10. package/src/decorators/factory.decorator.ts +0 -13
  11. package/src/decorators/model.decorator.ts +0 -10
  12. package/src/decorators/module.decorator.ts +0 -13
  13. package/src/decorators/overlay.decorator.ts +0 -10
  14. package/src/decorators/resource.decorator.ts +0 -10
  15. package/src/decorators/test-container.spec.ts +0 -50
  16. package/src/decorators/test-container.ts +0 -56
  17. package/src/functions/dependency/dependency.model.spec.ts +0 -43
  18. package/src/functions/dependency/dependency.model.ts +0 -178
  19. package/src/functions/diff/diff-metadata.model.ts +0 -51
  20. package/src/functions/diff/diff.model.ts +0 -33
  21. package/src/functions/diff/diff.utility.ts +0 -163
  22. package/src/functions/module/module.abstract.ts +0 -59
  23. package/src/functions/module/module.interface.ts +0 -5
  24. package/src/index.ts +0 -62
  25. package/src/models/action.interface.ts +0 -35
  26. package/src/models/app/app.interface.ts +0 -5
  27. package/src/models/app/app.model.ts +0 -111
  28. package/src/models/deployment/deployment.interface.ts +0 -5
  29. package/src/models/deployment/deployment.model.ts +0 -35
  30. package/src/models/environment/environment.interface.ts +0 -6
  31. package/src/models/environment/environment.model.spec.ts +0 -125
  32. package/src/models/environment/environment.model.ts +0 -55
  33. package/src/models/execution/execution.interface.ts +0 -8
  34. package/src/models/execution/execution.model.spec.ts +0 -62
  35. package/src/models/execution/execution.model.ts +0 -89
  36. package/src/models/image/image.interface.ts +0 -8
  37. package/src/models/image/image.model.ts +0 -62
  38. package/src/models/model.abstract.ts +0 -324
  39. package/src/models/model.interface.ts +0 -42
  40. package/src/models/pipeline/pipeline.interface.ts +0 -6
  41. package/src/models/pipeline/pipeline.model.ts +0 -47
  42. package/src/models/region/region.interface.ts +0 -5
  43. package/src/models/region/region.model.spec.ts +0 -162
  44. package/src/models/region/region.model.ts +0 -48
  45. package/src/models/server/server.interface.ts +0 -7
  46. package/src/models/server/server.model.ts +0 -56
  47. package/src/models/service/service.interface.ts +0 -5
  48. package/src/models/service/service.model.ts +0 -25
  49. package/src/models/support/support.interface.ts +0 -6
  50. package/src/models/support/support.model.spec.ts +0 -78
  51. package/src/models/support/support.model.ts +0 -52
  52. package/src/overlays/anchor.abstract.ts +0 -41
  53. package/src/overlays/anchor.interface.ts +0 -7
  54. package/src/overlays/anchor.spec.ts +0 -41
  55. package/src/overlays/overlay-data.repository.ts +0 -76
  56. package/src/overlays/overlay.abstract.ts +0 -64
  57. package/src/overlays/overlay.interface.ts +0 -9
  58. package/src/overlays/overlay.service.ts +0 -38
  59. package/src/overlays/overlay.spec.ts +0 -86
  60. package/src/resources/resource-action.interface.ts +0 -9
  61. package/src/resources/resource-data.repository.spec.ts +0 -133
  62. package/src/resources/resource-data.repository.ts +0 -92
  63. package/src/resources/resource.abstract.ts +0 -108
  64. package/src/resources/resource.interface.ts +0 -7
  65. package/src/resources/resource.spec.ts +0 -60
  66. package/src/resources/shared-resource.abstract.ts +0 -53
  67. package/src/resources/shared-resource.spec.ts +0 -133
  68. package/src/services/serialization/model/__snapshots__/model-serialization.service.spec.ts.snap +0 -656
  69. package/src/services/serialization/model/model-serialization.service.spec.ts +0 -195
  70. package/src/services/serialization/model/model-serialization.service.ts +0 -172
  71. package/src/services/serialization/resource/__snapshots__/resource-serialization.service.spec.ts.snap +0 -284
  72. package/src/services/serialization/resource/resource-serialization.service.spec.ts +0 -311
  73. package/src/services/serialization/resource/resource-serialization.service.ts +0 -166
  74. package/src/services/state-management/local.state-provider.spec.ts +0 -42
  75. package/src/services/state-management/local.state-provider.ts +0 -23
  76. package/src/services/state-management/state-management.service.ts +0 -43
  77. package/src/services/state-management/state-provider.interface.ts +0 -5
  78. package/src/services/transaction/__snapshots__/transaction.service.spec.ts.snap +0 -284
  79. package/src/services/transaction/transaction.service.spec.ts +0 -823
  80. package/src/services/transaction/transaction.service.ts +0 -386
  81. package/test/app.e2e-spec.ts +0 -104
  82. package/test/helpers/test-classes.ts +0 -31
  83. package/test/models/__snapshots__/model.e2e-spec.ts.snap +0 -451
  84. package/test/models/model.e2e-spec.ts +0 -366
  85. package/tsconfig.build.json +0 -4
  86. package/tsconfig.json +0 -9
@@ -1,195 +0,0 @@
1
- import { ModelSerializedOutput } from '../../../app.type.js';
2
- import { Container } from '../../../decorators/container.js';
3
- import { IDependency } from '../../../functions/dependency/dependency.model.js';
4
- import { App } from '../../../models/app/app.model.js';
5
- import { Environment } from '../../../models/environment/environment.model.js';
6
- import { Image } from '../../../models/image/image.model.js';
7
- import { Region } from '../../../models/region/region.model.js';
8
- import { Server } from '../../../models/server/server.model.js';
9
- import { Service } from '../../../models/service/service.model.js';
10
- import { Support } from '../../../models/support/support.model.js';
11
- import { OverlayDataRepository, OverlayDataRepositoryFactory } from '../../../overlays/overlay-data.repository.js';
12
- import { ModelSerializationService } from './model-serialization.service.js';
13
-
14
- describe('Model Serialization Service UT', () => {
15
- beforeEach(() => {
16
- Container.registerFactory(OverlayDataRepository, OverlayDataRepositoryFactory);
17
- });
18
-
19
- afterEach(() => {
20
- Container.reset();
21
- });
22
-
23
- describe('deserialize()', () => {
24
- it('should throw error when de-serializing an unknown class', async () => {
25
- const serializedOutput: ModelSerializedOutput = {
26
- anchors: [],
27
- dependencies: [
28
- {
29
- from: 'app=name',
30
- } as IDependency,
31
- ],
32
- models: {
33
- 'app=name': { className: 'ClassNotExist', model: null },
34
- } as any,
35
- modules: [],
36
- overlays: [],
37
- };
38
-
39
- const service = new ModelSerializationService();
40
- await expect(async () => {
41
- await service.deserialize(serializedOutput);
42
- }).rejects.toThrowError();
43
- });
44
-
45
- it('should throw error when de-serializing a class with default unSynth', async () => {
46
- const serializedOutput: ModelSerializedOutput = {
47
- anchors: [],
48
- dependencies: [
49
- {
50
- from: 'app=name',
51
- } as IDependency,
52
- ],
53
- models: {
54
- 'app=name': { className: 'Service', model: null },
55
- } as any,
56
- modules: [],
57
- overlays: [],
58
- };
59
-
60
- const service = new ModelSerializationService();
61
- service.registerClass('Service', Service);
62
-
63
- await expect(async () => {
64
- await service.deserialize(serializedOutput);
65
- }).rejects.toThrowErrorMatchingInlineSnapshot(`"Method not implemented! Use derived class implementation"`);
66
- });
67
-
68
- it('should deserialize unknown classes when registered', async () => {
69
- const app0 = new App('test-app');
70
- const region0 = new Region('region-0');
71
- app0.addRegion(region0);
72
-
73
- const service = new ModelSerializationService();
74
- service.registerClass('App', App);
75
- service.registerClass('Region', Region);
76
-
77
- const output = await service.serialize(app0);
78
- const app1 = (await service.deserialize(output)) as App;
79
-
80
- expect(app1.name).toBe('test-app');
81
- });
82
-
83
- it('should deserialize known classes', async () => {
84
- const app0 = new App('test-app');
85
- const region0 = new Region('region-0');
86
- app0.addRegion(region0);
87
-
88
- const service = new ModelSerializationService();
89
- service.registerClass('App', App);
90
- service.registerClass('Region', Region);
91
-
92
- const output = await service.serialize(app0);
93
- const app1 = (await service.deserialize(output)) as App;
94
-
95
- expect(app1.name).toBe('test-app');
96
- });
97
-
98
- it('should return the serialized root on deserialization', async () => {
99
- const app0 = new App('test-app');
100
- const region0 = new Region('region-0');
101
- app0.addRegion(region0);
102
-
103
- const service = new ModelSerializationService();
104
- service.registerClass('App', App);
105
- service.registerClass('Region', Region);
106
-
107
- const output = await service.serialize(region0);
108
- const region1 = (await service.deserialize(output)) as Region;
109
-
110
- expect(region1.regionId).toBe('region-0');
111
- });
112
-
113
- it('should have exact same dependencies on deserialized object as original object', async () => {
114
- const app = new App('test');
115
- const image = new Image('test', '0.0.1', {
116
- dockerfilePath: 'path/to/Dockerfile',
117
- });
118
- app.addImage(image);
119
- const server = new Server('server-1', image);
120
- app.addServer(server);
121
-
122
- const service = new ModelSerializationService();
123
- service.registerClass('App', App);
124
- service.registerClass('Image', Image);
125
- service.registerClass('Server', Server);
126
-
127
- const appSerialized = await service.serialize(app);
128
- const appDeserialized = (await service.deserialize(appSerialized)) as App;
129
-
130
- const newAppDependencies = (await service.serialize(appDeserialized)).dependencies.sort((a, b) =>
131
- a.from + a.to > b.from + b.to ? 1 : b.from + b.to > a.from + a.to ? -1 : 0,
132
- );
133
- const oldAppDependencies = appSerialized.dependencies.sort((a, b) =>
134
- a.from + a.to > b.from + b.to ? 1 : b.from + b.to > a.from + a.to ? -1 : 0,
135
- );
136
- expect(newAppDependencies).toEqual(oldAppDependencies);
137
- });
138
- });
139
-
140
- describe('serialize()', () => {
141
- it('should serialize an empty app', async () => {
142
- const app0 = new App('test-app');
143
-
144
- const service = new ModelSerializationService();
145
- expect(await service.serialize(app0)).toMatchSnapshot();
146
- });
147
-
148
- it('should serialize a non-empty app', async () => {
149
- const app0 = new App('test-app');
150
- const image0 = new Image('image', '0.0.1', {
151
- dockerfilePath: '/Dockerfile',
152
- });
153
- const region0 = new Region('region-1');
154
- const environment0 = new Environment('qa');
155
- app0.addImage(image0);
156
- app0.addRegion(region0);
157
- app0.addServer(new Server('backend', image0));
158
- app0.addSupport(new Support('nginx', 'nginx'));
159
- environment0.environmentVariables.set('key', 'value');
160
- region0.addEnvironment(environment0);
161
-
162
- const service = new ModelSerializationService();
163
- expect(await service.serialize(app0)).toMatchSnapshot();
164
- });
165
-
166
- it('should serialize only boundary members', async () => {
167
- const app0 = new App('test-app');
168
- const region0_1 = new Region('region-1');
169
- const region0_2 = new Region('region-2');
170
- const environment0_1 = new Environment('qa');
171
- const environment0_2 = new Environment('qa');
172
- app0.addRegion(region0_1);
173
- app0.addRegion(region0_2);
174
- region0_1.addEnvironment(environment0_1);
175
- region0_2.addEnvironment(environment0_2);
176
-
177
- const service = new ModelSerializationService();
178
- expect(await service.serialize(region0_1)).toMatchSnapshot();
179
- });
180
-
181
- it('should serialize when multiple models have dependency on same model', async () => {
182
- const service = new ModelSerializationService();
183
-
184
- const app0 = new App('test-app');
185
- const image0 = new Image('image', '0.0.1', { dockerfilePath: '/Dockerfile' });
186
- app0.addImage(image0);
187
- const server0 = new Server('server-0', image0);
188
- app0.addServer(server0);
189
- const server1 = new Server('server-1', image0);
190
- app0.addServer(server1);
191
-
192
- expect(await service.serialize(app0)).toMatchSnapshot();
193
- });
194
- });
195
- });
@@ -1,172 +0,0 @@
1
- import { IUnknownModel, ModelSerializedOutput, UnknownModel, UnknownOverlay } from '../../../app.type.js';
2
- import { Container } from '../../../decorators/container.js';
3
- import { Factory } from '../../../decorators/factory.decorator.js';
4
- import { AModule } from '../../../functions/module/module.abstract.js';
5
- import { IModule } from '../../../functions/module/module.interface.js';
6
- import { IAnchor } from '../../../overlays/anchor.interface.js';
7
- import { Dependency, IDependency } from '../../../functions/dependency/dependency.model.js';
8
- import { IOverlay } from '../../../overlays/overlay.interface.js';
9
- import { OverlayDataRepository } from '../../../overlays/overlay-data.repository.js';
10
-
11
- export class ModelSerializationService {
12
- private MODEL_DESERIALIZATION_TIMEOUT_IN_MS = 5000;
13
-
14
- private readonly classMapping: { [key: string]: any } = {};
15
-
16
- private readonly modules: AModule[] = [];
17
-
18
- async deserialize(serializedOutput: ModelSerializedOutput): Promise<UnknownModel> {
19
- const deReferencePromises: {
20
- [p: string]: [Promise<boolean>, (value: boolean) => void, (error: Error) => void, NodeJS.Timeout];
21
- } = {};
22
- const seen: { [p: string]: UnknownModel } = {};
23
-
24
- const deReferenceContext = async (context: string): Promise<UnknownModel> => {
25
- if (!seen[context]) {
26
- if (deReferencePromises[context]) {
27
- await deReferencePromises[context][0];
28
- } else {
29
- deReferencePromises[context] = [] as any;
30
- const promise = new Promise<boolean>((resolve, reject) => {
31
- deReferencePromises[context][1] = resolve;
32
- deReferencePromises[context][2] = reject;
33
- });
34
- deReferencePromises[context][0] = promise;
35
-
36
- deReferencePromises[context][3] = setTimeout(() => {
37
- deReferencePromises[context][2](new Error('DeReferencing model operation timed out!'));
38
- }, this.MODEL_DESERIALIZATION_TIMEOUT_IN_MS);
39
- await promise;
40
- }
41
- }
42
-
43
- return seen[context];
44
- };
45
-
46
- const deserializeModel = async (context: string): Promise<UnknownModel> => {
47
- const { className, model } = serializedOutput.models[context];
48
- const deserializationClass = this.classMapping[className];
49
-
50
- seen[context] = await deserializationClass.unSynth(model, deReferenceContext);
51
- if (deReferencePromises[context] !== undefined) {
52
- deReferencePromises[context][1](true);
53
- clearTimeout(deReferencePromises[context][3]);
54
- }
55
-
56
- return seen[context];
57
- };
58
-
59
- // Deserialize all serialized models.
60
- const promiseToDeserializeModels: Promise<UnknownModel>[] = [];
61
- for (const context in serializedOutput.models) {
62
- promiseToDeserializeModels.push(deserializeModel(context));
63
- }
64
- await Promise.all(promiseToDeserializeModels);
65
-
66
- for (const a of serializedOutput.anchors) {
67
- const { className, parent } = a;
68
- const deserializationClass = this.classMapping[className];
69
-
70
- const anchor = await deserializationClass.unSynth(deserializationClass, a, deReferenceContext);
71
- seen[parent.context]['anchors'].push(anchor);
72
- }
73
-
74
- for (const d of serializedOutput.dependencies) {
75
- const dependency = Dependency.unSynth(seen[d.from], seen[d.to], d);
76
- if (!seen[d.from]['dependencies'].some((d) => d.from === dependency.from && d.to === dependency.to)) {
77
- seen[d.from]['dependencies'].push(dependency);
78
- }
79
- }
80
-
81
- // Deserialize all modules.
82
- this.modules.splice(0, this.modules.length); // Empty modules array.
83
- for (const { className, module } of serializedOutput.modules) {
84
- const deserializationClass = this.classMapping[className];
85
-
86
- const newModule = await deserializationClass.unSynth(deserializationClass, module, deReferenceContext);
87
- this.modules.push(newModule);
88
- }
89
-
90
- // Deserialize all overlays.
91
- const newOverlays: UnknownOverlay[] = [];
92
- const oldOverlays: UnknownOverlay[] = [];
93
- for (const { className, overlay } of serializedOutput.overlays) {
94
- const deserializationClass = this.classMapping[className];
95
- const newOverlay = await deserializationClass.unSynth(deserializationClass, overlay, deReferenceContext);
96
- newOverlays.push(newOverlay);
97
- const oldOverlay = await deserializationClass.unSynth(deserializationClass, overlay, deReferenceContext);
98
- oldOverlays.push(oldOverlay);
99
- }
100
- // Initialize a new instance of OverlayDataRepository, overwriting the previous one.
101
- await Container.get(OverlayDataRepository, { args: [true, newOverlays, oldOverlays] });
102
-
103
- // If no dependencies to serialize, return the first seen model.
104
- return serializedOutput.dependencies.length > 0 ? seen[serializedOutput.dependencies[0].from] : seen[0];
105
- }
106
-
107
- registerClass(className: string, deserializationClass: any): void {
108
- this.classMapping[className] = deserializationClass;
109
- }
110
-
111
- registerModule(module: AModule): void {
112
- this.modules.push(module);
113
- }
114
-
115
- async serialize(root: UnknownModel): Promise<ModelSerializedOutput> {
116
- const boundary = root.getBoundaryMembers();
117
- const anchors: (IAnchor & { className: string })[] = [];
118
- const dependencies: IDependency[] = [];
119
- const models: { [key: string]: { className: string; model: IUnknownModel } } = {};
120
- const modules: { className: string; module: IModule }[] = [];
121
- const overlays: { className: string; overlay: IOverlay }[] = [];
122
-
123
- for (const model of boundary) {
124
- for (const a of model['anchors']) {
125
- anchors.push({ ...a.synth(), className: a.constructor.name });
126
- }
127
-
128
- for (const d of model['dependencies']) {
129
- // Skip dependencies that are not part of boundary.
130
- if (
131
- !boundary.some((m) => m.getContext() === d.from.getContext()) ||
132
- !boundary.some((m) => m.getContext() === d.to.getContext())
133
- ) {
134
- continue;
135
- }
136
-
137
- dependencies.push(d.synth());
138
- }
139
-
140
- const context = model.getContext();
141
- if (!models[context]) {
142
- models[context] = {
143
- className: model.constructor.name,
144
- model: model.synth() as IUnknownModel,
145
- };
146
- }
147
- }
148
-
149
- for (const module of this.modules) {
150
- modules.push({ className: module.constructor.name, module: module.synth() });
151
- }
152
-
153
- const overlayDataRepository = await Container.get(OverlayDataRepository);
154
- for (const overlay of overlayDataRepository.getByProperties()) {
155
- overlays.push({ className: overlay.constructor.name, overlay: overlay.synth() });
156
- }
157
-
158
- return { anchors, dependencies, models, modules, overlays };
159
- }
160
- }
161
-
162
- @Factory<ModelSerializationService>(ModelSerializationService)
163
- export class ModelSerializationServiceFactory {
164
- private static instance: ModelSerializationService;
165
-
166
- static async create(): Promise<ModelSerializationService> {
167
- if (!this.instance) {
168
- this.instance = new ModelSerializationService();
169
- }
170
- return this.instance;
171
- }
172
- }
@@ -1,284 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`Resource Serialization Service UT deserialize() should deserialize a resource with complex properties 1`] = `
4
- [
5
- TestResource {
6
- "MODEL_NAME": "test-resource",
7
- "MODEL_TYPE": "resource",
8
- "_deleteMarker": false,
9
- "anchors": [],
10
- "dependencies": [],
11
- "properties": {
12
- "key1": {
13
- "key2": {
14
- "key3": "value3",
15
- },
16
- "key4": "value4",
17
- },
18
- },
19
- "resourceId": "resource-1",
20
- "response": {
21
- "response1": "value1",
22
- },
23
- },
24
- ]
25
- `;
26
-
27
- exports[`Resource Serialization Service UT deserialize() should deserialize a single resource 1`] = `
28
- [
29
- TestResource {
30
- "MODEL_NAME": "test-resource",
31
- "MODEL_TYPE": "resource",
32
- "_deleteMarker": false,
33
- "anchors": [],
34
- "dependencies": [],
35
- "properties": {
36
- "key1": "value1",
37
- },
38
- "resourceId": "resource-1",
39
- "response": {
40
- "response1": "value1",
41
- },
42
- },
43
- ]
44
- `;
45
-
46
- exports[`Resource Serialization Service UT deserialize() should deserialize a single shared resource 1`] = `
47
- [
48
- TestResource {
49
- "MODEL_NAME": "test-resource",
50
- "MODEL_TYPE": "resource",
51
- "_deleteMarker": false,
52
- "anchors": [],
53
- "dependencies": [
54
- {
55
- "from": "test-resource=resource-1",
56
- "relationship": {
57
- "onField": "resourceId",
58
- "toField": "resourceId",
59
- "type": "parent",
60
- },
61
- "to": "shared-test-resource=resource-2",
62
- },
63
- ],
64
- "properties": {
65
- "key1": "value1",
66
- },
67
- "resourceId": "resource-1",
68
- "response": {
69
- "response1": "value1",
70
- },
71
- },
72
- SharedTestResource {
73
- "MODEL_NAME": "shared-test-resource",
74
- "MODEL_TYPE": "shared-resource",
75
- "_deleteMarker": false,
76
- "anchors": [],
77
- "dependencies": [
78
- {
79
- "from": "shared-test-resource=resource-2",
80
- "relationship": {
81
- "onField": "resourceId",
82
- "toField": "resourceId",
83
- "type": "child",
84
- },
85
- "to": "test-resource=resource-1",
86
- },
87
- ],
88
- "properties": {},
89
- "resourceId": "resource-2",
90
- "response": {},
91
- },
92
- ]
93
- `;
94
-
95
- exports[`Resource Serialization Service UT serialize() should not serialize resources marked for deletion 1`] = `
96
- {
97
- "dependencies": [],
98
- "resources": {
99
- "resource-1": {
100
- "className": "TestResource",
101
- "resource": {
102
- "properties": {
103
- "key1": "value1",
104
- },
105
- "resourceId": "resource-1",
106
- "response": {
107
- "response1": "value1",
108
- },
109
- },
110
- },
111
- },
112
- "sharedResources": {},
113
- }
114
- `;
115
-
116
- exports[`Resource Serialization Service UT serialize() should serialize an empty array 1`] = `
117
- {
118
- "dependencies": [],
119
- "resources": {},
120
- "sharedResources": {},
121
- }
122
- `;
123
-
124
- exports[`Resource Serialization Service UT serialize() should serialize dependencies and properties and resources 1`] = `
125
- {
126
- "dependencies": [
127
- {
128
- "behaviors": [
129
- {
130
- "forAction": "delete",
131
- "onAction": "delete",
132
- "onField": "resourceId",
133
- "toField": "resourceId",
134
- },
135
- ],
136
- "from": "test-resource=resource-1",
137
- "relationship": {
138
- "onField": "resourceId",
139
- "toField": "resourceId",
140
- "type": "parent",
141
- },
142
- "to": "test-resource=resource-2",
143
- },
144
- {
145
- "behaviors": [
146
- {
147
- "forAction": "add",
148
- "onAction": "add",
149
- "onField": "resourceId",
150
- "toField": "resourceId",
151
- },
152
- {
153
- "forAction": "update",
154
- "onAction": "add",
155
- "onField": "resourceId",
156
- "toField": "resourceId",
157
- },
158
- ],
159
- "from": "test-resource=resource-2",
160
- "relationship": {
161
- "onField": "resourceId",
162
- "toField": "resourceId",
163
- "type": "child",
164
- },
165
- "to": "test-resource=resource-1",
166
- },
167
- ],
168
- "resources": {
169
- "resource-1": {
170
- "className": "TestResource",
171
- "resource": {
172
- "properties": {
173
- "key1": "value1",
174
- },
175
- "resourceId": "resource-1",
176
- "response": {
177
- "response1": "value1",
178
- },
179
- },
180
- },
181
- "resource-2": {
182
- "className": "TestResource",
183
- "resource": {
184
- "properties": {
185
- "key2": "value2",
186
- },
187
- "resourceId": "resource-2",
188
- "response": {
189
- "response2": "value2",
190
- },
191
- },
192
- },
193
- },
194
- "sharedResources": {},
195
- }
196
- `;
197
-
198
- exports[`Resource Serialization Service UT serialize() should serialize non-empty array 1`] = `
199
- {
200
- "dependencies": [],
201
- "resources": {
202
- "resource-1": {
203
- "className": "TestResource",
204
- "resource": {
205
- "properties": {},
206
- "resourceId": "resource-1",
207
- "response": {},
208
- },
209
- },
210
- },
211
- "sharedResources": {},
212
- }
213
- `;
214
-
215
- exports[`Resource Serialization Service UT serialize() should serialize shared resources 1`] = `
216
- {
217
- "dependencies": [
218
- {
219
- "behaviors": [
220
- {
221
- "forAction": "delete",
222
- "onAction": "delete",
223
- "onField": "resourceId",
224
- "toField": "resourceId",
225
- },
226
- ],
227
- "from": "test-resource=resource-1",
228
- "relationship": {
229
- "onField": "resourceId",
230
- "toField": "resourceId",
231
- "type": "parent",
232
- },
233
- "to": "shared-test-resource=resource-2",
234
- },
235
- {
236
- "behaviors": [
237
- {
238
- "forAction": "add",
239
- "onAction": "add",
240
- "onField": "resourceId",
241
- "toField": "resourceId",
242
- },
243
- {
244
- "forAction": "update",
245
- "onAction": "add",
246
- "onField": "resourceId",
247
- "toField": "resourceId",
248
- },
249
- ],
250
- "from": "shared-test-resource=resource-2",
251
- "relationship": {
252
- "onField": "resourceId",
253
- "toField": "resourceId",
254
- "type": "child",
255
- },
256
- "to": "test-resource=resource-1",
257
- },
258
- ],
259
- "resources": {
260
- "resource-1": {
261
- "className": "TestResource",
262
- "resource": {
263
- "properties": {},
264
- "resourceId": "resource-1",
265
- "response": {},
266
- },
267
- },
268
- },
269
- "sharedResources": {
270
- "resource-2": {
271
- "className": "SharedTestResource",
272
- "resource": {
273
- "properties": {
274
- "key2": "value2",
275
- },
276
- "resourceId": "resource-2",
277
- "response": {
278
- "response2": "value2",
279
- },
280
- },
281
- },
282
- },
283
- }
284
- `;