@@ -103,6 +103,84 @@ func TestStateVersionsList(t *testing.T) {
103
103
})
104
104
}
105
105
106
+ func TestStateVersionsUpload (t * testing.T ) {
107
+ skipUnlessBeta (t )
108
+
109
+ client := testClient (t )
110
+
111
+ wTest , wTestCleanup := createWorkspace (t , client , nil )
112
+ t .Cleanup (wTestCleanup )
113
+
114
+ state , err := os .ReadFile ("test-fixtures/state-version/terraform.tfstate" )
115
+ if err != nil {
116
+ t .Fatal (err )
117
+ }
118
+
119
+ jsonState , err := os .ReadFile ("test-fixtures/json-state/state.json" )
120
+ if err != nil {
121
+ t .Fatal (err )
122
+ }
123
+
124
+ jsonStateOutputs , err := os .ReadFile ("test-fixtures/json-state-outputs/everything.json" )
125
+ if err != nil {
126
+ t .Fatal (err )
127
+ }
128
+
129
+ t .Run ("can create finalized state versions" , func (t * testing.T ) {
130
+ ctx := context .Background ()
131
+ _ , err := client .Workspaces .Lock (ctx , wTest .ID , WorkspaceLockOptions {})
132
+ require .NoError (t , err )
133
+
134
+ sv , err := client .StateVersions .Upload (ctx , wTest .ID , StateVersionUploadOptions {
135
+ StateVersionCreateOptions : StateVersionCreateOptions {
136
+ Lineage : String ("741c4949-60b9-5bb1-5bf8-b14f4bb14af3" ),
137
+ MD5 : String (fmt .Sprintf ("%x" , md5 .Sum (state ))),
138
+ Serial : Int64 (1 ),
139
+ JSONStateOutputs : String (base64 .StdEncoding .EncodeToString (jsonStateOutputs )),
140
+ },
141
+ RawState : state ,
142
+ RawJSONState : jsonState ,
143
+ })
144
+ require .NoError (t , err )
145
+
146
+ _ , err = client .Workspaces .Unlock (ctx , wTest .ID )
147
+ require .NoError (t , err )
148
+
149
+ assert .NotEmpty (t , sv .DownloadURL )
150
+ assert .Equal (t , sv .Status , StateVersionFinalized )
151
+ })
152
+
153
+ t .Run ("cannot provide base64 state parameter when uploading" , func (t * testing.T ) {
154
+ ctx := context .Background ()
155
+ _ , err = client .StateVersions .Upload (ctx , wTest .ID , StateVersionUploadOptions {
156
+ StateVersionCreateOptions : StateVersionCreateOptions {
157
+ Lineage : String ("741c4949-60b9-5bb1-5bf8-b14f4bb14af3" ),
158
+ MD5 : String (fmt .Sprintf ("%x" , md5 .Sum (state ))),
159
+ Serial : Int64 (1 ),
160
+ State : String (base64 .StdEncoding .EncodeToString (state )),
161
+ JSONStateOutputs : String (base64 .StdEncoding .EncodeToString (jsonStateOutputs )),
162
+ },
163
+ RawState : state ,
164
+ RawJSONState : jsonState ,
165
+ })
166
+ require .ErrorIs (t , err , ErrStateMustBeOmitted )
167
+ })
168
+
169
+ t .Run ("RawState parameter is required when uploading" , func (t * testing.T ) {
170
+ ctx := context .Background ()
171
+ _ , err = client .StateVersions .Upload (ctx , wTest .ID , StateVersionUploadOptions {
172
+ StateVersionCreateOptions : StateVersionCreateOptions {
173
+ Lineage : String ("741c4949-60b9-5bb1-5bf8-b14f4bb14af3" ),
174
+ MD5 : String (fmt .Sprintf ("%x" , md5 .Sum (state ))),
175
+ Serial : Int64 (1 ),
176
+ JSONStateOutputs : String (base64 .StdEncoding .EncodeToString (jsonStateOutputs )),
177
+ },
178
+ RawJSONState : jsonState ,
179
+ })
180
+ require .ErrorIs (t , err , ErrRequiredRawState )
181
+ })
182
+ }
183
+
106
184
func TestStateVersionsCreate (t * testing.T ) {
107
185
client := testClient (t )
108
186
ctx := context .Background ()
@@ -125,6 +203,34 @@ func TestStateVersionsCreate(t *testing.T) {
125
203
t .Fatal (err )
126
204
}
127
205
206
+ t .Run ("can create pending state versions" , func (t * testing.T ) {
207
+ skipUnlessBeta (t )
208
+
209
+ ctx := context .Background ()
210
+ _ , err := client .Workspaces .Lock (ctx , wTest .ID , WorkspaceLockOptions {})
211
+ if err != nil {
212
+ t .Fatal (err )
213
+ }
214
+
215
+ sv , err := client .StateVersions .Create (ctx , wTest .ID , StateVersionCreateOptions {
216
+ Lineage : String ("741c4949-60b9-5bb1-5bf8-b14f4bb14af3" ),
217
+ MD5 : String (fmt .Sprintf ("%x" , md5 .Sum (state ))),
218
+ Serial : Int64 (1 ),
219
+ })
220
+ require .NoError (t , err )
221
+
222
+ // Workspaces must be force-unlocked when there is a pending state version
223
+ _ , err = client .Workspaces .ForceUnlock (ctx , wTest .ID )
224
+ if err != nil {
225
+ t .Fatal (err )
226
+ }
227
+
228
+ sv , err = client .StateVersions .Read (ctx , sv .ID )
229
+ assert .ErrorIs (t , err , ErrResourceNotFound )
230
+
231
+ assert .Equal (t , StateVersionPending , sv .Status )
232
+ })
233
+
128
234
t .Run ("with valid options" , func (t * testing.T ) {
129
235
ctx := context .Background ()
130
236
_ , err := client .Workspaces .Lock (ctx , wTest .ID , WorkspaceLockOptions {})
@@ -285,7 +391,7 @@ func TestStateVersionsCreate(t *testing.T) {
285
391
assert .Equal (t , err , ErrRequiredM5 )
286
392
})
287
393
288
- t .Run ("withous serial" , func (t * testing.T ) {
394
+ t .Run ("without serial" , func (t * testing.T ) {
289
395
sv , err := client .StateVersions .Create (ctx , wTest .ID , StateVersionCreateOptions {
290
396
MD5 : String (fmt .Sprintf ("%x" , md5 .Sum (state ))),
291
397
State : String (base64 .StdEncoding .EncodeToString (state )),
@@ -294,15 +400,6 @@ func TestStateVersionsCreate(t *testing.T) {
294
400
assert .Equal (t , err , ErrRequiredSerial )
295
401
})
296
402
297
- t .Run ("without state" , func (t * testing.T ) {
298
- sv , err := client .StateVersions .Create (ctx , wTest .ID , StateVersionCreateOptions {
299
- MD5 : String (fmt .Sprintf ("%x" , md5 .Sum (state ))),
300
- Serial : Int64 (0 ),
301
- })
302
- assert .Nil (t , sv )
303
- assert .Equal (t , err , ErrRequiredState )
304
- })
305
-
306
403
t .Run ("with invalid workspace id" , func (t * testing.T ) {
307
404
sv , err := client .StateVersions .Create (ctx , badIdentifier , StateVersionCreateOptions {})
308
405
assert .Nil (t , sv )
0 commit comments