apikey_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package sqlstore
  2. import (
  3. "github.com/grafana/grafana/pkg/models"
  4. "github.com/stretchr/testify/assert"
  5. "testing"
  6. "time"
  7. )
  8. func TestApiKeyDataAccess(t *testing.T) {
  9. mockTimeNow()
  10. defer resetTimeNow()
  11. t.Run("Testing API Key data access", func(t *testing.T) {
  12. InitTestDB(t)
  13. t.Run("Given saved api key", func(t *testing.T) {
  14. cmd := models.AddApiKeyCommand{OrgId: 1, Name: "hello", Key: "asd"}
  15. err := AddApiKey(&cmd)
  16. assert.Nil(t, err)
  17. t.Run("Should be able to get key by name", func(t *testing.T) {
  18. query := models.GetApiKeyByNameQuery{KeyName: "hello", OrgId: 1}
  19. err = GetApiKeyByName(&query)
  20. assert.Nil(t, err)
  21. assert.NotNil(t, query.Result)
  22. })
  23. })
  24. t.Run("Add non expiring key", func(t *testing.T) {
  25. cmd := models.AddApiKeyCommand{OrgId: 1, Name: "non-expiring", Key: "asd1", SecondsToLive: 0}
  26. err := AddApiKey(&cmd)
  27. assert.Nil(t, err)
  28. query := models.GetApiKeyByNameQuery{KeyName: "non-expiring", OrgId: 1}
  29. err = GetApiKeyByName(&query)
  30. assert.Nil(t, err)
  31. assert.Nil(t, query.Result.Expires)
  32. })
  33. t.Run("Add an expiring key", func(t *testing.T) {
  34. //expires in one hour
  35. cmd := models.AddApiKeyCommand{OrgId: 1, Name: "expiring-in-an-hour", Key: "asd2", SecondsToLive: 3600}
  36. err := AddApiKey(&cmd)
  37. assert.Nil(t, err)
  38. query := models.GetApiKeyByNameQuery{KeyName: "expiring-in-an-hour", OrgId: 1}
  39. err = GetApiKeyByName(&query)
  40. assert.Nil(t, err)
  41. assert.True(t, *query.Result.Expires >= timeNow().Unix())
  42. // timeNow() has been called twice since creation; once by AddApiKey and once by GetApiKeyByName
  43. // therefore two seconds should be subtracted by next value retuned by timeNow()
  44. // that equals the number by which timeSeed has been advanced
  45. then := timeNow().Add(-2 * time.Second)
  46. expected := then.Add(1 * time.Hour).UTC().Unix()
  47. assert.Equal(t, *query.Result.Expires, expected)
  48. })
  49. t.Run("Add a key with negative lifespan", func(t *testing.T) {
  50. //expires in one day
  51. cmd := models.AddApiKeyCommand{OrgId: 1, Name: "key-with-negative-lifespan", Key: "asd3", SecondsToLive: -3600}
  52. err := AddApiKey(&cmd)
  53. assert.EqualError(t, err, models.ErrInvalidApiKeyExpiration.Error())
  54. query := models.GetApiKeyByNameQuery{KeyName: "key-with-negative-lifespan", OrgId: 1}
  55. err = GetApiKeyByName(&query)
  56. assert.EqualError(t, err, "Invalid API Key")
  57. })
  58. t.Run("Add keys", func(t *testing.T) {
  59. //never expires
  60. cmd := models.AddApiKeyCommand{OrgId: 1, Name: "key1", Key: "key1", SecondsToLive: 0}
  61. err := AddApiKey(&cmd)
  62. assert.Nil(t, err)
  63. //expires in 1s
  64. cmd = models.AddApiKeyCommand{OrgId: 1, Name: "key2", Key: "key2", SecondsToLive: 1}
  65. err = AddApiKey(&cmd)
  66. assert.Nil(t, err)
  67. //expires in one hour
  68. cmd = models.AddApiKeyCommand{OrgId: 1, Name: "key3", Key: "key3", SecondsToLive: 3600}
  69. err = AddApiKey(&cmd)
  70. assert.Nil(t, err)
  71. // advance mocked getTime by 1s
  72. timeNow()
  73. query := models.GetApiKeysQuery{OrgId: 1, IncludeInvalid: false}
  74. err = GetApiKeys(&query)
  75. assert.Nil(t, err)
  76. for _, k := range query.Result {
  77. if k.Name == "key2" {
  78. t.Fatalf("key2 should not be there")
  79. }
  80. }
  81. query = models.GetApiKeysQuery{OrgId: 1, IncludeInvalid: true}
  82. err = GetApiKeys(&query)
  83. assert.Nil(t, err)
  84. found := false
  85. for _, k := range query.Result {
  86. if k.Name == "key2" {
  87. found = true
  88. }
  89. }
  90. assert.True(t, found)
  91. })
  92. })
  93. }