package password

import (
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"golang.org/x/crypto/bcrypt"
)

func TestHash(t *testing.T) {
	t.Parallel()

	type args struct {
		password string
	}

	tests := []struct {
		name    string
		args    args
		wantErr require.ErrorAssertionFunc
	}{
		{
			name: "Hash valid password",
			args: args{
				password: "securePassword123!",
			},
			wantErr: require.NoError,
		},
		{
			name: "Long password",
			args: args{
				password: strings.Repeat("a", 75),
			},
			wantErr: require.Error,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()

			gotHashedPassword, gotTokenKey, err := Hash(tt.args.password)
			tt.wantErr(t, err, "Hash() should not return an error")

			if err != nil {
				return
			}

			assert.NotEmpty(t, gotHashedPassword, "Hash() gotHashedPassword should not be empty")
			assert.NotEmpty(t, gotTokenKey, "Hash() gotTokenKey should not be empty")

			require.NoError(t, bcrypt.CompareHashAndPassword([]byte(gotHashedPassword), []byte(tt.args.password)), "Hash() hashed password does not match original password")

			assert.GreaterOrEqual(t, len(gotTokenKey), 43, "Hash() gotTokenKey should be at least 43 characters long")
		})
	}
}

func TestGenerateTokenKey(t *testing.T) {
	t.Parallel()

	tokenKey, err := GenerateTokenKey()
	require.NoError(t, err)
	assert.NotEmpty(t, tokenKey, "GenerateTokenKey() tokenKey should not be empty")
	assert.GreaterOrEqual(t, len(tokenKey), 43, "GenerateTokenKey() tokenKey should be at least 43 characters long")
}
