@@ -2,11 +2,13 @@ import _ from "lodash";
22import ProjectService , { IProjectService } from "./projectService" ;
33import MockFactory from "../common/mockFactory" ;
44import { StorageProviderFactory } from "../providers/storage/storageProviderFactory" ;
5- import { IProject , IExportFormat , ISecurityToken , AssetState } from "../models/applicationState" ;
5+ import { IProject , IExportFormat , ISecurityToken ,
6+ AssetState , IAsset , IAssetMetadata } from "../models/applicationState" ;
67import { constants } from "../common/constants" ;
78import { ExportProviderFactory } from "../providers/export/exportProviderFactory" ;
89import { generateKey } from "../common/crypto" ;
910import { encryptProject } from "../common/utils" ;
11+ import { AssetService } from "./assetService" ;
1012
1113describe ( "Project Service" , ( ) => {
1214 let projectSerivce : IProjectService = null ;
@@ -146,15 +148,105 @@ describe("Project Service", () => {
146148 expect ( projectSerivce . isDuplicate ( testProject , projectList ) ) . toEqual ( true ) ;
147149 } ) ;
148150
149- it ( "deletes all asset metadata files when project is deleted" , async ( ) => {
150- const assets = MockFactory . createTestAssets ( 10 ) ;
151+ function populateProjectAssets ( project ?: IProject , assetCount = 10 ) {
152+ if ( ! project ) {
153+ project = MockFactory . createTestProject ( ) ;
154+ }
155+ const assets = MockFactory . createTestAssets ( assetCount ) ;
151156 assets . forEach ( ( asset ) => {
152157 asset . state = AssetState . Tagged ;
153158 } ) ;
154159
155- testProject . assets = _ . keyBy ( assets , ( asset ) => asset . id ) ;
160+ project . assets = _ . keyBy ( assets , ( asset ) => asset . id ) ;
161+ return project ;
162+ }
163+
164+ it ( "deletes all asset metadata files when project is deleted" , async ( ) => {
165+ const assetCount = 10 ;
166+ populateProjectAssets ( testProject ) ;
156167
157168 await projectSerivce . delete ( testProject ) ;
158- expect ( storageProviderMock . deleteFile . mock . calls ) . toHaveLength ( assets . length + 1 ) ;
169+ expect ( storageProviderMock . deleteFile . mock . calls ) . toHaveLength ( assetCount + 1 ) ;
170+ } ) ;
171+
172+ it ( "Deletes tag from all assets within project" , async ( ) => {
173+ const tag1 = "tag1" ;
174+ const tag2 = "tag2" ;
175+ const region = MockFactory . createTestRegion ( undefined , [ tag1 , tag2 ] ) ;
176+ const asset : IAsset = {
177+ ...MockFactory . createTestAsset ( "1" ) ,
178+ state : AssetState . Tagged ,
179+ } ;
180+ const assetMetadata = MockFactory . createTestAssetMetadata ( asset , [ region ] ) ;
181+ AssetService . prototype . getAssetMetadata = jest . fn ( ( asset : IAsset ) => Promise . resolve ( assetMetadata ) ) ;
182+
183+ const saveMetadata = jest . fn ( ) ;
184+ AssetService . prototype . save = saveMetadata ;
185+
186+ const expectedAssetMetadata : IAssetMetadata = {
187+ ...MockFactory . createTestAssetMetadata (
188+ asset ,
189+ [
190+ {
191+ ...region ,
192+ tags : [ tag2 ] ,
193+ } ,
194+ ] ,
195+ ) ,
196+
197+ } ;
198+ const project = populateProjectAssets ( ) ;
199+ await projectSerivce . deleteTag ( project , tag1 , assetMetadata ) ;
200+ expect ( saveMetadata ) . toBeCalledWith ( expectedAssetMetadata ) ;
201+ } ) ;
202+
203+ it ( "Deletes any empty regions after deleting only tag from region" , async ( ) => {
204+ const tag1 = "tag1" ;
205+ const region = MockFactory . createTestRegion ( undefined , [ tag1 ] ) ;
206+ const asset : IAsset = {
207+ ...MockFactory . createTestAsset ( "1" ) ,
208+ state : AssetState . Tagged ,
209+ } ;
210+ const assetMetadata = MockFactory . createTestAssetMetadata ( asset , [ region ] ) ;
211+ AssetService . prototype . getAssetMetadata = jest . fn ( ( asset : IAsset ) => Promise . resolve ( assetMetadata ) ) ;
212+
213+ const saveMetadata = jest . fn ( ) ;
214+ AssetService . prototype . save = saveMetadata ;
215+
216+ const expectedAssetMetadata : IAssetMetadata = MockFactory . createTestAssetMetadata ( asset , [ ] ) ;
217+ const project = populateProjectAssets ( ) ;
218+ await projectSerivce . deleteTag ( project , tag1 , assetMetadata ) ;
219+ expect ( saveMetadata ) . toBeCalledWith ( expectedAssetMetadata ) ;
220+ } ) ;
221+
222+ it ( "Updates renamed tag within all assets of project" , async ( ) => {
223+ const tag1 = "tag1" ;
224+ const newTag = "tag2" ;
225+ const region = MockFactory . createTestRegion ( undefined , [ tag1 ] ) ;
226+ const asset : IAsset = {
227+ ...MockFactory . createTestAsset ( "1" ) ,
228+ state : AssetState . Tagged ,
229+ } ;
230+ const assetMetadata = MockFactory . createTestAssetMetadata ( asset , [ region ] ) ;
231+ AssetService . prototype . getAssetMetadata = jest . fn ( ( asset : IAsset ) => Promise . resolve ( assetMetadata ) ) ;
232+
233+ const saveMetadata = jest . fn ( ) ;
234+ AssetService . prototype . save = saveMetadata ;
235+
236+ const expectedAssetMetadata : IAssetMetadata = {
237+ ...MockFactory . createTestAssetMetadata (
238+ asset ,
239+ [
240+ {
241+ ...region ,
242+ tags : [ newTag ] ,
243+ } ,
244+ ] ,
245+ ) ,
246+
247+ } ;
248+ const project = populateProjectAssets ( ) ;
249+ await projectSerivce . renameTag ( project , tag1 , newTag , assetMetadata ) ;
250+ expect ( saveMetadata ) . toBeCalledWith ( expectedAssetMetadata ) ;
159251 } ) ;
160252} ) ;
0 commit comments