84 lines
2.0 KiB
Go
84 lines
2.0 KiB
Go
package credentialstore
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestStoreAndRetrieve(t *testing.T) {
|
|
nonce, err := Store("app-123", "secret-456")
|
|
require.NoError(t, err)
|
|
assert.NotEmpty(t, nonce)
|
|
assert.Len(t, nonce, 64) // 32 bytes hex-encoded = 64 chars
|
|
|
|
entry, ok := Retrieve(nonce)
|
|
require.True(t, ok)
|
|
assert.Equal(t, "app-123", entry.AppID)
|
|
assert.Equal(t, "secret-456", entry.AppSecret)
|
|
assert.False(t, entry.CreatedAt.IsZero())
|
|
}
|
|
|
|
func TestRetrieve_NotFound(t *testing.T) {
|
|
entry, ok := Retrieve("nonexistent-nonce")
|
|
assert.False(t, ok)
|
|
assert.Equal(t, Entry{}, entry)
|
|
}
|
|
|
|
func TestRetrieve_AlreadyRetrieved_OneTimeUse(t *testing.T) {
|
|
nonce, err := Store("app-abc", "secret-xyz")
|
|
require.NoError(t, err)
|
|
|
|
// First retrieval succeeds
|
|
entry, ok := Retrieve(nonce)
|
|
require.True(t, ok)
|
|
assert.Equal(t, "app-abc", entry.AppID)
|
|
|
|
// Second retrieval fails (one-time use)
|
|
entry2, ok2 := Retrieve(nonce)
|
|
assert.False(t, ok2)
|
|
assert.Equal(t, Entry{}, entry2)
|
|
}
|
|
|
|
func TestStore_MultipleEntries(t *testing.T) {
|
|
nonce1, err := Store("app1", "secret1")
|
|
require.NoError(t, err)
|
|
|
|
nonce2, err := Store("app2", "secret2")
|
|
require.NoError(t, err)
|
|
|
|
assert.NotEqual(t, nonce1, nonce2)
|
|
|
|
entry1, ok1 := Retrieve(nonce1)
|
|
require.True(t, ok1)
|
|
assert.Equal(t, "app1", entry1.AppID)
|
|
|
|
entry2, ok2 := Retrieve(nonce2)
|
|
require.True(t, ok2)
|
|
assert.Equal(t, "app2", entry2.AppID)
|
|
}
|
|
|
|
func TestStore_GeneratesUniqueNonces(t *testing.T) {
|
|
nonces := make(map[string]bool)
|
|
for i := 0; i < 100; i++ {
|
|
nonce, err := Store("app", "secret")
|
|
require.NoError(t, err)
|
|
assert.False(t, nonces[nonce], "duplicate nonce generated")
|
|
nonces[nonce] = true
|
|
}
|
|
}
|
|
|
|
func TestEntry_StructFields(t *testing.T) {
|
|
now := time.Now()
|
|
e := Entry{
|
|
AppID: "test-app",
|
|
AppSecret: "test-secret",
|
|
CreatedAt: now,
|
|
}
|
|
assert.Equal(t, "test-app", e.AppID)
|
|
assert.Equal(t, "test-secret", e.AppSecret)
|
|
assert.Equal(t, now, e.CreatedAt)
|
|
}
|