package device

import (
	"bytes"
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestShrinkCredential(t *testing.T) {
	t.Run("authenticate response", func(t *testing.T) {
		credential := &Credential{
			Id:           "c1",
			TypeId:       "t1",
			EnrollmentId: "e1",
			UserId:       "u1",
			Specifier: &Credential_Webauthn{
				Webauthn: &Credential_WebAuthn{
					Id:        []byte{0, 1, 2},
					PublicKey: []byte{3, 4, 5},

					RegisterOptions:  bytes.Repeat([]byte{1}, 10),
					RegisterResponse: bytes.Repeat([]byte{2}, 10),
					AuthenticateResponse: [][]byte{
						bytes.Repeat([]byte{3}, 64*1024),
						bytes.Repeat([]byte{4}, 64*1024),
						bytes.Repeat([]byte{5}, 64*1024),
						bytes.Repeat([]byte{6}, 64*1024),
						bytes.Repeat([]byte{7}, 64*1024),
						bytes.Repeat([]byte{8}, 64*1024),
					},
				},
			},
		}
		shrinkCredential(credential)

		assert.Equal(t, "c1", credential.GetId())
		assert.Equal(t, "t1", credential.GetTypeId())
		assert.Equal(t, "e1", credential.GetEnrollmentId())
		assert.Equal(t, "u1", credential.GetUserId())
		assert.Equal(t, []byte{0, 1, 2}, credential.GetWebauthn().GetId())
		assert.Equal(t, []byte{3, 4, 5}, credential.GetWebauthn().GetPublicKey())
		assert.Equal(t, bytes.Repeat([]byte{1}, 10), credential.GetWebauthn().GetRegisterOptions())
		assert.Equal(t, bytes.Repeat([]byte{2}, 10), credential.GetWebauthn().GetRegisterResponse())
		assert.Equal(t, [][]byte{
			bytes.Repeat([]byte{6}, 64*1024),
			bytes.Repeat([]byte{7}, 64*1024),
			bytes.Repeat([]byte{8}, 64*1024),
		}, credential.GetWebauthn().GetAuthenticateResponse())
	})
	t.Run("register response", func(t *testing.T) {
		credential := &Credential{
			Id:           "c1",
			TypeId:       "t1",
			EnrollmentId: "e1",
			UserId:       "u1",
			Specifier: &Credential_Webauthn{
				Webauthn: &Credential_WebAuthn{
					Id:        []byte{0, 1, 2},
					PublicKey: []byte{3, 4, 5},

					RegisterOptions:  bytes.Repeat([]byte{1}, 10),
					RegisterResponse: bytes.Repeat([]byte{2}, 256*1024),
				},
			},
		}
		shrinkCredential(credential)

		assert.Equal(t, "c1", credential.GetId())
		assert.Equal(t, "t1", credential.GetTypeId())
		assert.Equal(t, "e1", credential.GetEnrollmentId())
		assert.Equal(t, "u1", credential.GetUserId())
		assert.Equal(t, []byte{0, 1, 2}, credential.GetWebauthn().GetId())
		assert.Equal(t, []byte{3, 4, 5}, credential.GetWebauthn().GetPublicKey())
		assert.Equal(t, bytes.Repeat([]byte{1}, 10), credential.GetWebauthn().GetRegisterOptions())
		assert.Empty(t, credential.GetWebauthn().GetRegisterResponse())
		assert.Empty(t, credential.GetWebauthn().GetAuthenticateResponse())
	})
	t.Run("register options", func(t *testing.T) {
		credential := &Credential{
			Id:           "c1",
			TypeId:       "t1",
			EnrollmentId: "e1",
			UserId:       "u1",
			Specifier: &Credential_Webauthn{
				Webauthn: &Credential_WebAuthn{
					Id:        []byte{0, 1, 2},
					PublicKey: []byte{3, 4, 5},

					RegisterOptions: bytes.Repeat([]byte{1}, 256*1024),
				},
			},
		}
		shrinkCredential(credential)

		assert.Equal(t, "c1", credential.GetId())
		assert.Equal(t, "t1", credential.GetTypeId())
		assert.Equal(t, "e1", credential.GetEnrollmentId())
		assert.Equal(t, "u1", credential.GetUserId())
		assert.Equal(t, []byte{0, 1, 2}, credential.GetWebauthn().GetId())
		assert.Equal(t, []byte{3, 4, 5}, credential.GetWebauthn().GetPublicKey())
		assert.Empty(t, credential.GetWebauthn().GetRegisterOptions())
		assert.Empty(t, credential.GetWebauthn().GetRegisterResponse())
		assert.Empty(t, credential.GetWebauthn().GetAuthenticateResponse())
	})
}