@@ -22,6 +22,7 @@ import (
22
22
"fmt"
23
23
"io"
24
24
"net/http"
25
+ "os"
25
26
"strings"
26
27
"testing"
27
28
"time"
@@ -219,3 +220,97 @@ func TestSMS_sendSMS(t *testing.T) {
219
220
t .Errorf ("expected SMS failure to roll-back and delete code. got %v" , err )
220
221
}
221
222
}
223
+
224
+ func TestSMS_sendSMS_integration (t * testing.T ) {
225
+ t .Parallel ()
226
+
227
+ if testing .Short () {
228
+ t .Skipf ("🚧 Skipping twilio tests (short)!" )
229
+ }
230
+
231
+ accountSid := os .Getenv ("TWILIO_ACCOUNT_SID" )
232
+ authToken := os .Getenv ("TWILIO_AUTH_TOKEN" )
233
+ if accountSid == "" || authToken == "" {
234
+ t .Skipf ("🚧 🚧 Skipping twilio tests (missing TWILIO_ACCOUNT_SID/TWILIO_AUTH_TOKEN)" )
235
+ }
236
+
237
+ ctx := project .TestContext (t )
238
+
239
+ harness := envstest .NewServerConfig (t , testDatabaseInstance )
240
+ db := harness .Database
241
+
242
+ realm , err := db .FindRealm (1 )
243
+ if err != nil {
244
+ t .Fatal (err )
245
+ }
246
+ realm .AllowBulkUpload = true
247
+ if err := db .SaveRealm (realm , database .SystemTest ); err != nil {
248
+ t .Fatalf ("failed to save realm: %v" , err )
249
+ }
250
+
251
+ smsConfig := & database.SMSConfig {
252
+ RealmID : realm .ID ,
253
+ ProviderType : sms .ProviderTypeTwilio ,
254
+ TwilioAccountSid : accountSid ,
255
+ TwilioFromNumber : "+15005550008" , // magic number
256
+ TwilioAuthToken : authToken ,
257
+ }
258
+ if err := db .SaveSMSConfig (smsConfig ); err != nil {
259
+ t .Fatal (err )
260
+ }
261
+
262
+ smsProvider , err := realm .SMSProvider (harness .Database )
263
+ if err != nil {
264
+ t .Fatal (err )
265
+ }
266
+
267
+ membership := & database.Membership {
268
+ RealmID : realm .ID ,
269
+ Realm : realm ,
270
+ Permissions : rbac .CodeBulkIssue ,
271
+ }
272
+
273
+ ctx = controller .WithMembership (ctx , membership )
274
+
275
+ harness .Config .SMSSigning .FailClosed = true
276
+ c := issueapi .New (harness .Config , db , harness .RateLimiter , harness .KeyManager , harness .Renderer )
277
+
278
+ t .Run ("queue_full" , func (t * testing.T ) {
279
+ t .Parallel ()
280
+
281
+ request := & api.IssueCodeRequest {
282
+ TestType : "confirmed" ,
283
+ SymptomDate : time .Now ().UTC ().Add (- 48 * time .Hour ).Format (project .RFC3339Date ),
284
+ TZOffset : 0 ,
285
+ Phone : project .TestPhoneNumber ,
286
+ }
287
+ result := & issueapi.IssueResult {
288
+ HTTPCode : http .StatusOK ,
289
+ VerCode : & database.VerificationCode {
290
+ RealmID : realm .ID ,
291
+ Code : "00000001" ,
292
+ LongCode : "00000001ABC" ,
293
+ Claimed : true ,
294
+ TestType : "confirmed" ,
295
+ ExpiresAt : time .Now ().Add (time .Hour ),
296
+ LongExpiresAt : time .Now ().Add (time .Hour ),
297
+ },
298
+ }
299
+ if err := realm .SaveVerificationCode (db , result .VerCode ); err != nil {
300
+ t .Fatal (err )
301
+ }
302
+ // un-hmac the codes so rollback can find them.
303
+ result .VerCode .Code = "00000001"
304
+ result .VerCode .LongCode = "00000001ABC"
305
+
306
+ c .SendSMS (ctx , realm , smsProvider , nil , "" , request , result )
307
+ if result .ErrorReturn == nil {
308
+ t .Fatal ("expected failed SMS, but got no error response" )
309
+ } else if result .ErrorReturn .ErrorCode != api .ErrSMSQueueFull {
310
+ t .Fatal ("expected SMS failure code" )
311
+ }
312
+ if _ , err := realm .FindVerificationCodeByUUID (db , result .VerCode .UUID ); ! database .IsNotFound (err ) {
313
+ t .Errorf ("expected SMS failure to roll-back and delete code. got %v" , err )
314
+ }
315
+ })
316
+ }
0 commit comments