Skip to content

Commit d0a03b8

Browse files
authored
[Unit Tests] Update unit tests (#256)
1 parent 6404335 commit d0a03b8

File tree

8 files changed

+1359
-1303
lines changed

8 files changed

+1359
-1303
lines changed

src/persistence/MCWSPersistenceProvider.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export default class MCWSPersistenceProvider extends BaseMCWSPersistenceProvider
7878
} catch (error) {
7979
console.warn('MCWSPersistneceProvider:update', error);
8080

81-
return;
81+
return false;
8282
}
8383
}
8484

Lines changed: 224 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,138 +1,246 @@
1-
/*global define,describe,beforeEach,jasmine,Promise,it,expect*/
2-
define([
3-
// '../src/MCWSNamespaceModelProvider'
4-
], function (
5-
// MCWSNamespaceModelProvider
6-
) {
7-
'use strict';
8-
9-
xdescribe('MCWSNamespaceModelProvider', function () {
10-
var namespaceService,
1+
2+
import MCWSUserContainerProvider from '../MCWSUserContainerProvider';
3+
import MCWSPersistenceProvider from '../MCWSPersistenceProvider';
4+
import mcws from 'services/mcws/mcws';
5+
6+
describe('MCWS Providers', () => {
7+
let openmct;
8+
let someNamespace;
9+
let anotherNamespace;
10+
let personalContainerNamespace;
11+
let personalNamespace;
12+
let namespaces;
13+
let userContainerProvider;
14+
let persistenceProvider;
15+
16+
beforeEach(() => {
17+
openmct = {
18+
user: {
19+
getCurrentUser: () => Promise.resolve({ id: 'myUser' })
20+
}
21+
};
22+
23+
someNamespace = {
24+
id: 'some-namespace:root',
25+
key: 'some-namespace',
26+
name: 'Some Namespace',
27+
url: '/some/namespace/url'
28+
};
29+
anotherNamespace = {
30+
id: 'another-namespace:root',
31+
key: 'another-namespace',
32+
name: 'Another Namespace',
33+
url: '/another/namespace/url',
34+
location: 'some-namespace:root'
35+
};
36+
personalContainerNamespace = {
37+
id: 'personal',
38+
key: 'personal',
39+
name: 'personal',
40+
url: '/some/personal/namespace',
41+
containsNamespaces: true,
42+
childTemplate: {
43+
id: 'personal-{username}:root',
44+
key: 'personal-{username}',
45+
name: '{username}',
46+
url: '/some/personal/namespace/{username}'
47+
}
48+
};
49+
personalNamespace = {
50+
id: 'personal-myUser:root',
51+
key: 'personal-myUser',
52+
name: 'myUser',
53+
url: '/some/personal/namespace/myUser',
54+
location: 'personal'
55+
};
56+
57+
namespaces = [
1158
someNamespace,
1259
anotherNamespace,
1360
personalContainerNamespace,
14-
personalNamespace,
15-
namespaces,
16-
provider;
17-
18-
beforeEach(function () {
19-
namespaceService = jasmine.createSpyObj(
20-
'namespaceService',
21-
[
22-
'getPersistenceNamespaces',
23-
'getContainedNamespaces'
24-
]
61+
personalNamespace
62+
];
63+
64+
const roots = [personalContainerNamespace];
65+
userContainerProvider = new MCWSUserContainerProvider(openmct, roots);
66+
persistenceProvider = new MCWSPersistenceProvider(openmct, roots);
67+
68+
// Mock mcws service calls
69+
spyOn(userContainerProvider, 'getPersistenceNamespaces')
70+
.and.returnValue(Promise.resolve(namespaces));
71+
spyOn(userContainerProvider, 'getContainedNamespaces')
72+
.and.callFake((namespace) => {
73+
if (namespace.id === 'personal') {
74+
return Promise.resolve([personalNamespace]);
75+
}
76+
return Promise.resolve([]);
77+
});
78+
});
79+
80+
describe('MCWSUserContainerProvider', () => {
81+
it('gets container model with contained namespaces', async () => {
82+
const identifier = {
83+
namespace: 'personal',
84+
key: 'container'
85+
};
86+
const model = await userContainerProvider.get(identifier);
87+
88+
expect(model.type).toBe('folder');
89+
expect(model.composition).toEqual([{ key: 'root', namespace: 'personal-myUser' }]);
90+
expect(model.location).toBe('ROOT');
91+
});
92+
});
93+
94+
describe('MCWSPersistenceProvider', () => {
95+
let mcwsNamespace;
96+
97+
beforeEach(() => {
98+
// Mock mcws namespace operations
99+
const fileOps = {
100+
read: () => Promise.resolve({
101+
json: () => Promise.resolve({
102+
type: 'folder',
103+
name: 'Test Object'
104+
})
105+
}),
106+
create: jasmine.createSpy('create').and.returnValue(Promise.resolve(true)),
107+
replace: jasmine.createSpy('replace').and.returnValue(Promise.resolve(true))
108+
};
109+
mcwsNamespace = {
110+
opaqueFile: () => fileOps
111+
};
112+
113+
spyOn(persistenceProvider, 'getPersistenceNamespaces')
114+
.and.returnValue(Promise.resolve(namespaces));
115+
// Mock the private getNamespace method through the mcws import
116+
spyOn(mcws, 'namespace').and.returnValue(mcwsNamespace);
117+
});
118+
119+
it('gets persisted objects', async () => {
120+
const identifier = {
121+
namespace: 'personal-myUser',
122+
key: 'some-object'
123+
};
124+
const result = await persistenceProvider.get(identifier);
125+
126+
expect(result).toBeDefined();
127+
expect(result.type).toBe('folder');
128+
expect(result.name).toBe('Test Object');
129+
expect(result.identifier).toEqual(identifier);
130+
});
131+
132+
it('handles abort signal when getting objects', async () => {
133+
const identifier = {
134+
namespace: 'personal-myUser',
135+
key: 'some-object'
136+
};
137+
const abortSignal = new AbortController().signal;
138+
139+
await persistenceProvider.get(identifier, abortSignal);
140+
141+
expect(mcws.namespace).toHaveBeenCalledWith(
142+
jasmine.any(String),
143+
{ signal: abortSignal }
25144
);
145+
});
26146

27-
someNamespace = {
28-
id: 'some-namespace:root',
29-
key: 'some-namespace',
30-
name: 'Some Namespace',
31-
url: '/some/namespace/url'
147+
it('creates new objects', async () => {
148+
const domainObject = {
149+
identifier: {
150+
namespace: 'some-namespace',
151+
key: 'new-object'
152+
},
153+
type: 'folder',
154+
name: 'New Folder'
32155
};
33-
anotherNamespace = {
34-
id: 'another-namespace:root',
35-
key: 'another-namespace',
36-
name: 'Another Namespace',
37-
url: '/another/namespace/url',
38-
location: 'some-namespace:root'
156+
157+
const success = await persistenceProvider.create(domainObject);
158+
const expectedModel = {
159+
type: 'folder',
160+
name: 'New Folder'
39161
};
40-
personalContainerNamespace = {
41-
id: 'personal',
42-
key: 'personal',
43-
name: 'personal',
44-
url: '/some/personal/namespace'
162+
163+
expect(success).toBe(true);
164+
expect(mcwsNamespace.opaqueFile('new-object').create)
165+
.toHaveBeenCalledWith(expectedModel);
166+
});
167+
168+
it('updates existing objects', async () => {
169+
const domainObject = {
170+
identifier: {
171+
namespace: 'some-namespace',
172+
key: 'existing-object'
173+
},
174+
type: 'folder',
175+
name: 'Updated Folder'
45176
};
46-
personalNamespace = {
47-
id: 'personal-myUser:root',
48-
key: 'personal-myUser}',
49-
name: 'myUser',
50-
url: '/some/personal/namespace/myUser',
51-
location: 'personal'
177+
178+
const success = await persistenceProvider.update(domainObject);
179+
const expectedModel = {
180+
type: 'folder',
181+
name: 'Updated Folder'
52182
};
53183

54-
namespaces = [
55-
someNamespace,
56-
anotherNamespace,
57-
personalContainerNamespace,
58-
personalNamespace
59-
];
184+
expect(success).toBe(true);
185+
expect(mcwsNamespace.opaqueFile('existing-object').replace)
186+
.toHaveBeenCalledWith(expectedModel);
187+
});
60188

61-
namespaceService
62-
.getPersistenceNamespaces
63-
.and.returnValue(Promise.resolve(namespaces));
189+
it('handles errors during get operation', async () => {
190+
const errorNamespace = {
191+
opaqueFile: () => ({
192+
read: () => Promise.reject(new Error('Network Error'))
193+
})
194+
};
195+
mcws.namespace.and.returnValue(errorNamespace);
64196

65-
namespaceService
66-
.getContainedNamespaces
67-
.and.callFake(function (namespace) {
68-
if (namespace.id === 'personal') {
69-
return Promise.resolve([personalNamespace]);
70-
}
71-
return Promise.resolve([]);
72-
});
197+
const identifier = {
198+
namespace: 'personal-myUser',
199+
key: 'error-object'
200+
};
201+
const result = await persistenceProvider.get(identifier);
73202

74-
provider = new MCWSNamespaceModelProvider(namespaceService);
203+
expect(result).toBeUndefined();
75204
});
76205

77-
describe('getModels', function () {
78-
var someNamespaceModel,
79-
anotherNamespaceModel,
80-
personalContainerNamespaceModel,
81-
personalNamespaceModel,
82-
allNamespaceModels;
83-
84-
beforeEach(function (done) {
85-
provider
86-
.getModels([
87-
'some-namespace:root',
88-
'another-namespace:root',
89-
'personal',
90-
'personal-myUser:root'
91-
])
92-
.then(function (models) {
93-
someNamespaceModel = models['some-namespace:root'];
94-
anotherNamespaceModel =
95-
models['another-namespace:root'];
96-
personalContainerNamespaceModel = models.personal;
97-
personalNamespaceModel = models['personal-myUser:root'];
98-
allNamespaceModels = [
99-
someNamespaceModel,
100-
anotherNamespaceModel,
101-
personalContainerNamespaceModel,
102-
personalNamespaceModel
103-
];
104-
})
105-
.then(done);
106-
});
206+
it('handles errors during create operation', async () => {
207+
const errorNamespace = {
208+
opaqueFile: () => ({
209+
create: () => Promise.reject(new Error('Creation Error'))
210+
})
211+
};
212+
mcws.namespace.and.returnValue(errorNamespace);
107213

108-
it('sets type to folder', function () {
109-
allNamespaceModels.forEach(function (namespaceModel) {
110-
expect(namespaceModel.type).toBe('folder');
111-
});
112-
});
214+
const domainObject = {
215+
identifier: {
216+
namespace: 'personal-myUser',
217+
key: 'error-object'
218+
},
219+
type: 'folder'
220+
};
221+
const success = await persistenceProvider.create(domainObject);
113222

114-
it('uses location specified in namespace definition', function () {
115-
expect(anotherNamespaceModel.location)
116-
.toBe('some-namespace:root');
117-
expect(personalNamespaceModel.location)
118-
.toBe('personal');
119-
});
223+
expect(success).toBe(false);
224+
});
120225

121-
it('sets default location if not specified', function () {
122-
expect(someNamespaceModel.location).toBe('ROOT');
123-
expect(personalContainerNamespaceModel.location).toBe('ROOT');
124-
});
226+
it('handles errors during update operation', async () => {
227+
const errorNamespace = {
228+
opaqueFile: () => ({
229+
replace: () => Promise.reject(new Error('Update Error'))
230+
})
231+
};
232+
mcws.namespace.and.returnValue(errorNamespace);
125233

126-
it('sets composition', function () {
127-
expect(someNamespaceModel.composition)
128-
.toEqual(jasmine.any(Array));
129-
expect(anotherNamespaceModel.composition)
130-
.toEqual(jasmine.any(Array));
131-
expect(personalContainerNamespaceModel.composition)
132-
.toEqual(['personal-myUser:root']);
133-
expect(personalNamespaceModel.composition)
134-
.toEqual(jasmine.any(Array));
135-
});
234+
const domainObject = {
235+
identifier: {
236+
namespace: 'personal-myUser',
237+
key: 'error-object'
238+
},
239+
type: 'folder'
240+
};
241+
const success = await persistenceProvider.update(domainObject);
242+
243+
expect(success).toBe(false);
136244
});
137245
});
138246
});

0 commit comments

Comments
 (0)