store_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package store
  2. import (
  3. "bytes"
  4. "context"
  5. "errors"
  6. "path/filepath"
  7. "testing"
  8. "time"
  9. )
  10. func TestStorePersistsAdminAndSessions(t *testing.T) {
  11. ctx := context.Background()
  12. path := filepath.Join(t.TempDir(), "vocat.db")
  13. database, err := Open(ctx, path)
  14. if err != nil {
  15. t.Fatalf("Open() error = %v", err)
  16. }
  17. passwordHash := []byte("password-hash")
  18. if err := database.SetAdmin(ctx, "admin", passwordHash); err != nil {
  19. t.Fatalf("SetAdmin() error = %v", err)
  20. }
  21. admin, err := database.AdminByUsername(ctx, "admin")
  22. if err != nil {
  23. t.Fatalf("AdminByUsername() error = %v", err)
  24. }
  25. tokenHash := bytes.Repeat([]byte{1}, 32)
  26. csrfHash := bytes.Repeat([]byte{2}, 32)
  27. expiresAt := time.Now().UTC().Add(time.Hour).Truncate(time.Second)
  28. if err := database.CreateSession(ctx, admin.ID, tokenHash, csrfHash, expiresAt); err != nil {
  29. t.Fatalf("CreateSession() error = %v", err)
  30. }
  31. if err := database.Close(); err != nil {
  32. t.Fatalf("Close() error = %v", err)
  33. }
  34. database, err = Open(ctx, path)
  35. if err != nil {
  36. t.Fatalf("reopen error = %v", err)
  37. }
  38. defer database.Close()
  39. session, err := database.SessionByTokenHash(ctx, tokenHash)
  40. if err != nil {
  41. t.Fatalf("SessionByTokenHash() error = %v", err)
  42. }
  43. if session.Admin.Username != "admin" || !bytes.Equal(session.CSRFHash, csrfHash) {
  44. t.Fatalf("unexpected session: %+v", session)
  45. }
  46. if !session.ExpiresAt.Equal(expiresAt) {
  47. t.Fatalf("ExpiresAt = %v, want %v", session.ExpiresAt, expiresAt)
  48. }
  49. }
  50. func TestDeleteExpiredSessions(t *testing.T) {
  51. ctx := context.Background()
  52. database, err := Open(ctx, ":memory:")
  53. if err != nil {
  54. t.Fatalf("Open() error = %v", err)
  55. }
  56. defer database.Close()
  57. if err := database.SetAdmin(ctx, "admin", []byte("hash")); err != nil {
  58. t.Fatal(err)
  59. }
  60. admin, err := database.CurrentAdmin(ctx)
  61. if err != nil {
  62. t.Fatal(err)
  63. }
  64. tokenHash := bytes.Repeat([]byte{3}, 32)
  65. if err := database.CreateSession(
  66. ctx,
  67. admin.ID,
  68. tokenHash,
  69. bytes.Repeat([]byte{4}, 32),
  70. time.Now().Add(-time.Minute),
  71. ); err != nil {
  72. t.Fatal(err)
  73. }
  74. if err := database.DeleteExpiredSessions(ctx, time.Now()); err != nil {
  75. t.Fatal(err)
  76. }
  77. if _, err := database.SessionByTokenHash(ctx, tokenHash); !errors.Is(err, ErrNotFound) {
  78. t.Fatalf("SessionByTokenHash() error = %v, want ErrNotFound", err)
  79. }
  80. }