2022-07-30 14:25:26 +01:00
// Copyright 2022 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2022-11-02 16:54:36 +08:00
package v1_17 // nolint
2022-07-30 14:25:26 +01:00
import (
"encoding/base32"
"testing"
2022-11-02 16:54:36 +08:00
"code.gitea.io/gitea/models/migrations/base"
2022-07-30 14:25:26 +01:00
"github.com/stretchr/testify/assert"
)
2022-11-02 16:54:36 +08:00
func Test_StoreWebauthnCredentialIDAsBytes ( t * testing . T ) {
2022-07-30 14:25:26 +01:00
// Create webauthnCredential table
type WebauthnCredential struct {
ID int64 ` xorm:"pk autoincr" `
Name string
LowerName string ` xorm:"unique(s)" `
UserID int64 ` xorm:"INDEX unique(s)" `
CredentialID string ` xorm:"INDEX VARCHAR(410)" `
PublicKey [ ] byte
AttestationType string
AAGUID [ ] byte
SignCount uint32 ` xorm:"BIGINT" `
CloneWarning bool
}
type ExpectedWebauthnCredential struct {
ID int64 ` xorm:"pk autoincr" `
CredentialID string // CredentialID is at most 1023 bytes as per spec released 20 July 2022
}
type ConvertedWebauthnCredential struct {
ID int64 ` xorm:"pk autoincr" `
CredentialIDBytes [ ] byte ` xorm:"VARBINARY(1024)" ` // CredentialID is at most 1023 bytes as per spec released 20 July 2022
}
// Prepare and load the testing database
2022-11-02 16:54:36 +08:00
x , deferable := base . PrepareTestEnv ( t , 0 , new ( WebauthnCredential ) , new ( ExpectedWebauthnCredential ) )
2022-07-30 14:25:26 +01:00
defer deferable ( )
if x == nil || t . Failed ( ) {
return
}
2022-11-02 16:54:36 +08:00
if err := StoreWebauthnCredentialIDAsBytes ( x ) ; err != nil {
2022-07-30 14:25:26 +01:00
assert . NoError ( t , err )
return
}
expected := [ ] ExpectedWebauthnCredential { }
if err := x . Table ( "expected_webauthn_credential" ) . Asc ( "id" ) . Find ( & expected ) ; ! assert . NoError ( t , err ) {
return
}
got := [ ] ConvertedWebauthnCredential { }
if err := x . Table ( "webauthn_credential" ) . Select ( "id, credential_id_bytes" ) . Asc ( "id" ) . Find ( & got ) ; ! assert . NoError ( t , err ) {
return
}
for i , e := range expected {
credIDBytes , _ := base32 . HexEncoding . DecodeString ( e . CredentialID )
assert . Equal ( t , credIDBytes , got [ i ] . CredentialIDBytes )
}
}