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  }