1
- import { logger , rosStackDeploy } from '../../src/common' ;
1
+ import { logger , rosStackDelete , rosStackDeploy } from '../../src/common' ;
2
2
import { context } from '../fixtures/contextFixture' ;
3
3
import { lang } from '../../src/lang' ;
4
4
5
5
const mockedCreateStack = jest . fn ( ) ;
6
6
const mockedUpdateStack = jest . fn ( ) ;
7
7
const mockedListStacks = jest . fn ( ) ;
8
8
const mockedGetStack = jest . fn ( ) ;
9
-
9
+ const mockedDeleteStack = jest . fn ( ) ;
10
10
jest . mock ( '@alicloud/ros20190910' , ( ) => ( {
11
11
...jest . requireActual ( '@alicloud/ros20190910' ) ,
12
12
__esModule : true ,
@@ -15,6 +15,7 @@ jest.mock('@alicloud/ros20190910', () => ({
15
15
updateStack : ( ) => mockedUpdateStack ( ) ,
16
16
listStacks : ( ) => mockedListStacks ( ) ,
17
17
getStack : ( ) => mockedGetStack ( ) ,
18
+ deleteStack : ( ) => mockedDeleteStack ( ) ,
18
19
} ) ) ,
19
20
} ) ) ;
20
21
@@ -25,64 +26,105 @@ describe('Unit test for rosClient', () => {
25
26
jest . clearAllMocks ( ) ;
26
27
} ) ;
27
28
28
- it ( 'should create a new stack if it does not exist' , async ( ) => {
29
- mockedListStacks . mockResolvedValue ( { statusCode : 200 , body : { stacks : [ ] } } ) ;
30
- mockedCreateStack . mockResolvedValue ( { body : { stackId : 'newStackId' } } ) ;
31
- mockedGetStack . mockResolvedValue ( { body : { status : 'CREATE_COMPLETE' } } ) ;
32
-
33
- await rosStackDeploy ( 'newStack' , { } , context ) ;
29
+ describe ( 'Unit tes for rosStackDeploy' , ( ) => {
30
+ it ( 'should create a new stack if it does not exist' , async ( ) => {
31
+ mockedListStacks . mockResolvedValue ( { statusCode : 200 , body : { stacks : [ ] } } ) ;
32
+ mockedCreateStack . mockResolvedValue ( { body : { stackId : 'newStackId' } } ) ;
33
+ mockedGetStack . mockResolvedValue ( { body : { status : 'CREATE_COMPLETE' } } ) ;
34
34
35
- expect ( mockedCreateStack ) . toHaveBeenCalled ( ) ;
36
- expect ( logger . info ) . toHaveBeenCalledWith ( expect . stringContaining ( 'createStack success' ) ) ;
37
- } ) ;
35
+ await rosStackDeploy ( 'newStack' , { } , context ) ;
38
36
39
- it ( 'should update an existing stack if it exists' , async ( ) => {
40
- mockedListStacks . mockResolvedValue ( {
41
- statusCode : 200 ,
42
- body : { stacks : [ { stackId : 'existingStackId' , Status : 'CREATE_COMPLETE' } ] } ,
37
+ expect ( mockedCreateStack ) . toHaveBeenCalled ( ) ;
38
+ expect ( logger . info ) . toHaveBeenCalledWith ( expect . stringContaining ( 'createStack success' ) ) ;
43
39
} ) ;
44
- mockedUpdateStack . mockResolvedValue ( { body : { stackId : 'existingStackId' } } ) ;
45
- mockedGetStack . mockResolvedValue ( { body : { status : 'UPDATE_COMPLETE' } } ) ;
46
40
47
- await rosStackDeploy ( 'existingStack' , { } , context ) ;
41
+ it ( 'should update an existing stack if it exists' , async ( ) => {
42
+ mockedListStacks . mockResolvedValue ( {
43
+ statusCode : 200 ,
44
+ body : { stacks : [ { stackId : 'existingStackId' , Status : 'CREATE_COMPLETE' } ] } ,
45
+ } ) ;
46
+ mockedUpdateStack . mockResolvedValue ( { body : { stackId : 'existingStackId' } } ) ;
47
+ mockedGetStack . mockResolvedValue ( { body : { status : 'UPDATE_COMPLETE' } } ) ;
48
48
49
- expect ( mockedUpdateStack ) . toHaveBeenCalled ( ) ;
50
- expect ( logger . info ) . toHaveBeenCalledWith ( expect . stringContaining ( 'stackUpdate success' ) ) ;
51
- } ) ;
49
+ await rosStackDeploy ( 'existingStack' , { } , context ) ;
52
50
53
- it ( 'should throw an error if the stack is in progress' , async ( ) => {
54
- mockedListStacks . mockResolvedValue ( {
55
- statusCode : 200 ,
56
- body : { stacks : [ { stackId : 'inProgressStackId' , Status : 'CREATE_IN_PROGRESS' } ] } ,
51
+ expect ( mockedUpdateStack ) . toHaveBeenCalled ( ) ;
52
+ expect ( logger . info ) . toHaveBeenCalledWith ( expect . stringContaining ( 'stackUpdate success' ) ) ;
57
53
} ) ;
58
54
59
- await expect ( rosStackDeploy ( 'inProgressStack' , { } , context ) ) . rejects . toThrow (
60
- 'fail to update stack, because stack status is CREATE_IN_PROGRESS' ,
61
- ) ;
62
- } ) ;
55
+ it ( 'should throw an error if the stack is in progress' , async ( ) => {
56
+ mockedListStacks . mockResolvedValue ( {
57
+ statusCode : 200 ,
58
+ body : { stacks : [ { stackId : 'inProgressStackId' , Status : 'CREATE_IN_PROGRESS' } ] } ,
59
+ } ) ;
63
60
64
- it ( 'should notify user with warning logs when update completely same stack' , async ( ) => {
65
- mockedListStacks . mockResolvedValue ( {
66
- statusCode : 200 ,
67
- body : { stacks : [ { stackId : 'existingStackId' , Status : 'CREATE_COMPLETE' } ] } ,
61
+ await expect ( rosStackDeploy ( 'inProgressStack' , { } , context ) ) . rejects . toThrow (
62
+ 'fail to update stack, because stack status is CREATE_IN_PROGRESS' ,
63
+ ) ;
68
64
} ) ;
69
- mockedUpdateStack . mockRejectedValueOnce ( {
70
- data : { statusCode : 400 , Message : 'Update the completely same stack' } ,
65
+
66
+ it ( 'should notify user with warning logs when update completely same stack' , async ( ) => {
67
+ mockedListStacks . mockResolvedValue ( {
68
+ statusCode : 200 ,
69
+ body : { stacks : [ { stackId : 'existingStackId' , Status : 'CREATE_COMPLETE' } ] } ,
70
+ } ) ;
71
+ mockedUpdateStack . mockRejectedValueOnce ( {
72
+ data : { statusCode : 400 , Message : 'Update the completely same stack' } ,
73
+ } ) ;
74
+ mockedGetStack . mockResolvedValue ( { body : { status : 'UPDATE_COMPLETE' } } ) ;
75
+
76
+ await rosStackDeploy ( 'existingStack' , { } , context ) ;
77
+
78
+ expect ( logger . warn ) . toHaveBeenCalledWith ( `${ lang . __ ( 'UPDATE_COMPLETELY_SAME_STACK' ) } ` ) ;
71
79
} ) ;
72
- mockedGetStack . mockResolvedValue ( { body : { status : 'UPDATE_COMPLETE' } } ) ;
73
80
74
- await rosStackDeploy ( 'existingStack' , { } , context ) ;
81
+ it ( 'should throw error when deploy stack failed' , async ( ) => {
82
+ mockedListStacks . mockResolvedValue ( { statusCode : 200 , body : { stacks : [ ] } } ) ;
83
+ mockedCreateStack . mockResolvedValueOnce ( { body : { stackId : 'newStackId' } } ) ;
84
+ mockedGetStack . mockResolvedValue ( { body : { status : 'ROLLBACK_COMPLETE' } } ) ;
75
85
76
- expect ( logger . warn ) . toHaveBeenCalledWith ( `${ lang . __ ( 'UPDATE_COMPLETELY_SAME_STACK' ) } ` ) ;
86
+ await expect ( rosStackDeploy ( 'newStack' , { } , context ) ) . rejects . toThrow (
87
+ `Stack operation failed with status: ROLLBACK_COMPLETE` ,
88
+ ) ;
89
+ } ) ;
77
90
} ) ;
78
91
79
- it ( 'should throw error when deploy stack failed' , async ( ) => {
80
- mockedListStacks . mockResolvedValue ( { statusCode : 200 , body : { stacks : [ ] } } ) ;
81
- mockedCreateStack . mockResolvedValueOnce ( { body : { stackId : 'newStackId' } } ) ;
82
- mockedGetStack . mockResolvedValue ( { body : { status : 'ROLLBACK_COMPLETE' } } ) ;
92
+ describe ( 'Unit test for rosStackDelete' , ( ) => {
93
+ it ( 'should delete the stack when the provided stack is exists' , async ( ) => {
94
+ mockedListStacks . mockResolvedValue ( {
95
+ statusCode : 200 ,
96
+ body : { stacks : [ { stackId : 'stackToDelete' , Status : 'UPDATE_COMPLETE' } ] } ,
97
+ } ) ;
98
+ mockedDeleteStack . mockResolvedValue ( { body : { stackId : 'stackToDelete' } } ) ;
83
99
84
- await expect ( rosStackDeploy ( 'newStack' , { } , context ) ) . rejects . toThrow (
85
- `Stack operation failed with status: ROLLBACK_COMPLETE` ,
86
- ) ;
100
+ mockedGetStack . mockResolvedValueOnce ( { body : { status : 'DELETE_COMPLETE' } } ) ;
101
+
102
+ await rosStackDelete ( context ) ;
103
+
104
+ expect ( logger . info ) . toHaveBeenCalledWith ( 'stack status: DELETE_COMPLETE' ) ;
105
+ expect ( logger . info ) . toHaveBeenCalledWith ( 'Stack: testStack deleted! ♻️' ) ;
106
+ } ) ;
107
+
108
+ it ( 'should throw an error when the stack does not exist' , async ( ) => {
109
+ mockedListStacks . mockResolvedValue ( { statusCode : 404 , body : { stacks : [ ] } } ) ;
110
+ await rosStackDelete ( context ) ;
111
+
112
+ expect ( logger . warn ) . toHaveBeenCalledWith ( 'Stack: testStack not exists, skipped! 🚫' ) ;
113
+ } ) ;
114
+
115
+ it ( 'should throw error when delete stack failed' , async ( ) => {
116
+ mockedListStacks . mockResolvedValue ( {
117
+ statusCode : 200 ,
118
+ body : { stacks : [ { stackId : 'stackToDelete' , Status : 'UPDATE_COMPLETE' } ] } ,
119
+ } ) ;
120
+ mockedDeleteStack . mockRejectedValue ( { data : { statusCode : 400 , Message : 'DELETE_FAILED' } } ) ;
121
+
122
+ await expect ( rosStackDelete ( context ) ) . rejects . toThrow (
123
+ JSON . stringify ( { statusCode : 400 , Message : 'DELETE_FAILED' } ) ,
124
+ ) ;
125
+ expect ( logger . error ) . toHaveBeenCalledWith (
126
+ expect . stringContaining ( 'Stack: testStack delete failed! ❌' ) ,
127
+ ) ;
128
+ } ) ;
87
129
} ) ;
88
130
} ) ;
0 commit comments