code.gitea.io/gitea@v1.21.7/models/migrations/v1_16/v210_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package v1_16 //nolint 5 6 import ( 7 "testing" 8 9 "code.gitea.io/gitea/models/migrations/base" 10 "code.gitea.io/gitea/modules/timeutil" 11 12 "github.com/stretchr/testify/assert" 13 "xorm.io/xorm/schemas" 14 ) 15 16 func Test_RemigrateU2FCredentials(t *testing.T) { 17 // Create webauthnCredential table 18 type WebauthnCredential struct { 19 ID int64 `xorm:"pk autoincr"` 20 Name string 21 LowerName string `xorm:"unique(s)"` 22 UserID int64 `xorm:"INDEX unique(s)"` 23 CredentialID string `xorm:"INDEX VARCHAR(410)"` // CredentalID in U2F is at most 255bytes / 5 * 8 = 408 - add a few extra characters for safety 24 PublicKey []byte 25 AttestationType string 26 SignCount uint32 `xorm:"BIGINT"` 27 CloneWarning bool 28 } 29 30 // Now migrate the old u2f registrations to the new format 31 type U2fRegistration struct { 32 ID int64 `xorm:"pk autoincr"` 33 Name string 34 UserID int64 `xorm:"INDEX"` 35 Raw []byte 36 Counter uint32 `xorm:"BIGINT"` 37 CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"` 38 UpdatedUnix timeutil.TimeStamp `xorm:"INDEX updated"` 39 } 40 41 type ExpectedWebauthnCredential struct { 42 ID int64 `xorm:"pk autoincr"` 43 CredentialID string `xorm:"INDEX VARCHAR(410)"` // CredentalID in U2F is at most 255bytes / 5 * 8 = 408 - add a few extra characters for safety 44 } 45 46 // Prepare and load the testing database 47 x, deferable := base.PrepareTestEnv(t, 0, new(WebauthnCredential), new(U2fRegistration), new(ExpectedWebauthnCredential)) 48 if x == nil || t.Failed() { 49 defer deferable() 50 return 51 } 52 defer deferable() 53 54 if x.Dialect().URI().DBType == schemas.SQLITE { 55 return 56 } 57 58 // Run the migration 59 if err := RemigrateU2FCredentials(x); err != nil { 60 assert.NoError(t, err) 61 return 62 } 63 64 expected := []ExpectedWebauthnCredential{} 65 if err := x.Table("expected_webauthn_credential").Asc("id").Find(&expected); !assert.NoError(t, err) { 66 return 67 } 68 69 got := []ExpectedWebauthnCredential{} 70 if err := x.Table("webauthn_credential").Select("id, credential_id").Asc("id").Find(&got); !assert.NoError(t, err) { 71 return 72 } 73 74 assert.EqualValues(t, expected, got) 75 }