customer/internal/service/encrypt/encrypt_test.go

183 lines
4.9 KiB
Go
Raw Normal View History

2023-05-16 01:12:07 +00:00
package encrypt_test
import (
"errors"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/models"
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/service/encrypt"
"penahub.gitlab.yandexcloud.net/pena-services/pena-social-auth/internal/service/encrypt/mocks"
)
var (
privateKeyCurve25519 = strings.Replace(
`-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIEIKn0BKwF3vZvODgWAnUIwQhd8de5oZhY48gc23EWfrfs
-----END PRIVATE KEY-----`,
"\t",
"",
-1,
)
privateKeyCurve25519Invalid = strings.Replace(
`-----BEGIN PRIVATE KEY-----
MC4CAQAwBQYDK2VwBCIE3vZvODgWAnUIhd8de5oZhY48gc23EWfrfs
-----END PRIVATE KEY-----`,
"\t",
"",
-1,
)
publicKeyCurve25519 = strings.Replace(
`-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAEbnIvjIMle4rqVol6K2XUqOxHy1KJoNoZdKJrRUPKL4=
-----END PUBLIC KEY-----`,
"\t",
"",
-1,
)
publicKeyCurve25519InvalidLength = strings.Replace(
`-----BEGIN PUBLIC KEY-----
MowBQYDK2VwA9yEAEbnIvjIMle4rqVol6K2XUqOxHy1KJoNoZdKJrRUPKL4=
-----END PUBLIC KEY-----`,
"\t",
"",
-1,
)
)
func TestSignCommonSecret(t *testing.T) {
t.Run("Успешная подпись общего секрета", func(t *testing.T) {
encryptService := encrypt.New(&encrypt.ServiceDeps{
PrivateCurveKey: privateKeyCurve25519,
SignSecret: "secret",
})
assert.NotPanics(t, func() {
encryptedText, err := encryptService.SignCommonSecret()
assert.NoError(t, err)
assert.NotEmpty(t, encryptedText)
assert.NotZero(t, encryptedText)
})
})
t.Run("Ошибка подписи из-за кривого ключа (заголовок имеется)", func(t *testing.T) {
encryptService := encrypt.New(&encrypt.ServiceDeps{
PrivateCurveKey: privateKeyCurve25519Invalid,
SignSecret: "secret",
})
assert.NotPanics(t, func() {
encryptedText, err := encryptService.SignCommonSecret()
assert.Error(t, err)
assert.Empty(t, encryptedText)
assert.Zero(t, encryptedText)
})
})
t.Run("Ошибка подписи из-за рандомного кривого ключа", func(t *testing.T) {
encryptService := encrypt.New(&encrypt.ServiceDeps{
PrivateCurveKey: "testtesttesttest",
SignSecret: "secret",
})
assert.NotPanics(t, func() {
encryptedText, err := encryptService.SignCommonSecret()
assert.Error(t, err)
assert.Empty(t, encryptedText)
assert.Zero(t, encryptedText)
})
})
}
func TestVerifySignature(t *testing.T) {
t.Run("Успешное подтвеждение подписи", func(t *testing.T) {
encryptService := encrypt.New(&encrypt.ServiceDeps{
PublicCurveKey: publicKeyCurve25519,
PrivateCurveKey: privateKeyCurve25519,
SignSecret: "secret",
})
assert.NotPanics(t, func() {
signature, _ := encryptService.SignCommonSecret()
isValid, err := encryptService.VerifySignature(signature)
assert.NoError(t, err)
assert.Equal(t, true, isValid)
})
})
t.Run("Неудачное подтверждение подписи из-за невалидности ключа", func(t *testing.T) {
encryptService := encrypt.New(&encrypt.ServiceDeps{
PublicCurveKey: "teettaegarehah",
PrivateCurveKey: privateKeyCurve25519,
SignSecret: "secret",
})
assert.NotPanics(t, func() {
signature, _ := encryptService.SignCommonSecret()
isValid, err := encryptService.VerifySignature(signature)
assert.Error(t, err)
assert.Equal(t, false, isValid)
})
})
t.Run("Неудачное подтверждение подписи при использовании ключа у которого невалидный размер (слишком большой)", func(t *testing.T) {
encryptService := encrypt.New(&encrypt.ServiceDeps{
PublicCurveKey: publicKeyCurve25519InvalidLength,
PrivateCurveKey: privateKeyCurve25519,
SignSecret: "secret",
})
assert.NotPanics(t, func() {
signature, _ := encryptService.SignCommonSecret()
isValid, err := encryptService.VerifySignature(signature)
assert.Error(t, err)
assert.Equal(t, false, isValid)
})
})
}
func TestVerifyJWT(t *testing.T) {
jwtToken := "token-token"
jwtUser := models.JWTAuthUser{
ID: "id1",
}
t.Run("Успешное подтверждение токена", func(t *testing.T) {
jwtUtil := mocks.NewJwtUtil(t)
encryptService := encrypt.New(&encrypt.ServiceDeps{
JWT: jwtUtil,
})
jwtUtil.EXPECT().Validate(jwtToken).Return(&jwtUser, nil).Once()
id, err := encryptService.VerifyJWT(jwtToken)
assert.NoError(t, err)
assert.Equal(t, jwtUser.ID, id)
})
t.Run("Ошибка подтверждения токена", func(t *testing.T) {
jwtUtil := mocks.NewJwtUtil(t)
encryptService := encrypt.New(&encrypt.ServiceDeps{
JWT: jwtUtil,
})
jwtUtil.EXPECT().Validate(jwtToken).Return(nil, errors.New("validate jwt error")).Once()
id, err := encryptService.VerifyJWT(jwtToken)
assert.Error(t, err)
assert.Empty(t, id)
})
}