1+ import _ from "lodash" ;
12import createMockStore , { MockStoreEnhanced } from "redux-mock-store" ;
23import { ActionTypes } from "./actionTypes" ;
34import * as projectActions from "./projectActions" ;
@@ -11,24 +12,29 @@ jest.mock("../../services/assetService");
1112import { AssetService } from "../../services/assetService" ;
1213import { ExportProviderFactory } from "../../providers/export/exportProviderFactory" ;
1314import { ExportAssetState , IExportProvider } from "../../providers/export/exportProvider" ;
14- import { IApplicationState } from "../../models/applicationState" ;
15+ import { IApplicationState , IProject } from "../../models/applicationState" ;
1516import initialState from "../store/initialState" ;
1617import { appInfo } from "../../common/appInfo" ;
18+ import registerMixins from "../../registerMixins" ;
1719
1820describe ( "Project Redux Actions" , ( ) => {
1921 let store : MockStoreEnhanced < IApplicationState > ;
2022 let projectServiceMock : jest . Mocked < typeof ProjectService > ;
2123 const appSettings = MockFactory . appSettings ( ) ;
2224
25+ beforeAll ( registerMixins ) ;
26+
2327 beforeEach ( ( ) => {
2428 const middleware = [ thunk ] ;
2529 const mockState : IApplicationState = {
2630 ...initialState ,
2731 appSettings,
2832 } ;
33+
2934 store = createMockStore < IApplicationState > ( middleware ) ( mockState ) ;
3035 projectServiceMock = ProjectService as jest . Mocked < typeof ProjectService > ;
3136 projectServiceMock . prototype . load = jest . fn ( ( project ) => Promise . resolve ( project ) ) ;
37+ projectServiceMock . prototype . save = jest . fn ( ( project ) => Promise . resolve ( project ) ) ;
3238 } ) ;
3339
3440 it ( "Load Project action resolves a promise and dispatches redux action" , async ( ) => {
@@ -255,4 +261,81 @@ describe("Project Redux Actions", () => {
255261
256262 expect ( mockExportProvider . export ) . toHaveBeenCalled ( ) ;
257263 } ) ;
264+
265+ describe ( "Updating project tags" , ( ) => {
266+ let project : IProject = null ;
267+
268+ beforeEach ( ( ) => {
269+ project = MockFactory . createTestProject ( "TestProject" ) ;
270+ const middleware = [ thunk ] ;
271+ const mockState : IApplicationState = {
272+ ...initialState ,
273+ currentProject : project ,
274+ appSettings,
275+ } ;
276+
277+ store = createMockStore < IApplicationState > ( middleware ) ( mockState ) ;
278+ } ) ;
279+
280+ it ( "Updates tags across all project assets when a tag is renamed" , async ( ) => {
281+ const projectAssets = _ . values ( project . assets ) ;
282+ const updatedTag = project . tags [ project . tags . length - 1 ] ;
283+
284+ const updatedAssets = [
285+ MockFactory . createTestAssetMetadata ( projectAssets [ 0 ] ) ,
286+ MockFactory . createTestAssetMetadata ( projectAssets [ 1 ] ) ,
287+ ] ;
288+
289+ const expectedTagName = `${ updatedTag . name } - updated` ;
290+
291+ const assetServiceMock = AssetService as jest . Mocked < typeof AssetService > ;
292+ assetServiceMock . prototype . renameTag = jest . fn ( ( ) => Promise . resolve ( updatedAssets ) ) ;
293+
294+ const actualUpdatedAssets = await projectActions . updateProjectTag (
295+ project ,
296+ updatedTag . name ,
297+ expectedTagName ,
298+ ) ( store . dispatch , store . getState ) ;
299+
300+ const actions = store . getActions ( ) ;
301+
302+ expect ( actions . length ) . toEqual ( 5 ) ;
303+ expect ( actions [ 0 ] . type ) . toEqual ( ActionTypes . SAVE_ASSET_METADATA_SUCCESS ) ;
304+ expect ( actions [ 1 ] . type ) . toEqual ( ActionTypes . SAVE_ASSET_METADATA_SUCCESS ) ;
305+ expect ( actions [ 2 ] . type ) . toEqual ( ActionTypes . SAVE_PROJECT_SUCCESS ) ;
306+ expect ( actions [ 3 ] . type ) . toEqual ( ActionTypes . LOAD_PROJECT_SUCCESS ) ;
307+ expect ( actions [ 4 ] . type ) . toEqual ( ActionTypes . UPDATE_PROJECT_TAG_SUCCESS ) ;
308+
309+ expect ( actualUpdatedAssets ) . toEqual ( updatedAssets ) ;
310+ } ) ;
311+
312+ it ( "Deletes tags across all project assets when a tag is renamed" , async ( ) => {
313+ const projectAssets = _ . values ( project . assets ) ;
314+ const deletedTag = project . tags [ project . tags . length - 1 ] ;
315+
316+ const updatedAssets = [
317+ MockFactory . createTestAssetMetadata ( projectAssets [ 0 ] ) ,
318+ MockFactory . createTestAssetMetadata ( projectAssets [ 1 ] ) ,
319+ ] ;
320+
321+ const assetServiceMock = AssetService as jest . Mocked < typeof AssetService > ;
322+ assetServiceMock . prototype . deleteTag = jest . fn ( ( ) => Promise . resolve ( updatedAssets ) ) ;
323+
324+ const actualUpdatedAssets = await projectActions . deleteProjectTag (
325+ project ,
326+ deletedTag . name ,
327+ ) ( store . dispatch , store . getState ) ;
328+
329+ const actions = store . getActions ( ) ;
330+
331+ expect ( actions . length ) . toEqual ( 5 ) ;
332+ expect ( actions [ 0 ] . type ) . toEqual ( ActionTypes . SAVE_ASSET_METADATA_SUCCESS ) ;
333+ expect ( actions [ 1 ] . type ) . toEqual ( ActionTypes . SAVE_ASSET_METADATA_SUCCESS ) ;
334+ expect ( actions [ 2 ] . type ) . toEqual ( ActionTypes . SAVE_PROJECT_SUCCESS ) ;
335+ expect ( actions [ 3 ] . type ) . toEqual ( ActionTypes . LOAD_PROJECT_SUCCESS ) ;
336+ expect ( actions [ 4 ] . type ) . toEqual ( ActionTypes . DELETE_PROJECT_TAG_SUCCESS ) ;
337+
338+ expect ( actualUpdatedAssets ) . toEqual ( updatedAssets ) ;
339+ } ) ;
340+ } ) ;
258341} ) ;
0 commit comments