|
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 = [ |
11 | 58 | someNamespace, |
12 | 59 | anotherNamespace, |
13 | 60 | 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 } |
25 | 144 | ); |
| 145 | + }); |
26 | 146 |
|
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' |
32 | 155 | }; |
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' |
39 | 161 | }; |
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' |
45 | 176 | }; |
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' |
52 | 182 | }; |
53 | 183 |
|
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 | + }); |
60 | 188 |
|
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); |
64 | 196 |
|
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); |
73 | 202 |
|
74 | | - provider = new MCWSNamespaceModelProvider(namespaceService); |
| 203 | + expect(result).toBeUndefined(); |
75 | 204 | }); |
76 | 205 |
|
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); |
107 | 213 |
|
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); |
113 | 222 |
|
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 | + }); |
120 | 225 |
|
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); |
125 | 233 |
|
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); |
136 | 244 | }); |
137 | 245 | }); |
138 | 246 | }); |
0 commit comments