josie / simplegit

package auth

import (
	"strings"
	"testing"
)

func TestHashAndCheckPassword(t *testing.T) {
	hash, err := HashPassword("correct horse")
	if err != nil {
		t.Fatalf("HashPassword: %v", err)
	}
	if !CheckPassword(hash, "correct horse") {
		t.Error("CheckPassword with the same password = false, want true")
	}
	if CheckPassword(hash, "battery staple") {
		t.Error("CheckPassword with wrong password = true, want false")
	}
	first, err := HashPassword("same password")
	if err != nil {
		t.Fatalf("HashPassword: %v", err)
	}
	second, err := HashPassword("same password")
	if err != nil {
		t.Fatalf("HashPassword: %v", err)
	}
	if first == second {
		t.Error("two hashes of one password are identical, want salted")
	}
}

func TestNewToken(t *testing.T) {
	seen := map[string]bool{}
	for range 10 {
		token, err := NewToken()
		if err != nil {
			t.Fatalf("NewToken: %v", err)
		}
		if len(token) != 64 {
			t.Errorf("token length = %d, want 64", len(token))
		}
		if seen[token] {
			t.Errorf("token %s repeated", token)
		}
		seen[token] = true
	}
}

func TestAPIToken(t *testing.T) {
	seen := map[string]bool{}
	for range 10 {
		token, err := NewAPIToken()
		if err != nil {
			t.Fatalf("NewAPIToken: %v", err)
		}
		if !strings.HasPrefix(token, "sg_") {
			t.Errorf("token %q lacks sg_ prefix", token)
		}
		if seen[token] {
			t.Errorf("token %s repeated", token)
		}
		seen[token] = true
	}

	if HashToken("sg_abc") != HashToken("sg_abc") {
		t.Error("HashToken is not deterministic")
	}
	if HashToken("sg_abc") == HashToken("sg_abd") {
		t.Error("HashToken collided on differing input")
	}
	if len(HashToken("sg_abc")) != 64 {
		t.Errorf("hash length = %d, want 64", len(HashToken("sg_abc")))
	}

	if hint := TokenHint("sg_abcdefghij"); hint != "sg_abcde" {
		t.Errorf("TokenHint = %q, want sg_abcde", hint)
	}
	if hint := TokenHint("short"); hint != "short" {
		t.Errorf("TokenHint(short) = %q, want short", hint)
	}
}