fake_test.go 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. /*
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5. http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. package fake
  13. import (
  14. "context"
  15. "errors"
  16. "fmt"
  17. "testing"
  18. "github.com/onsi/gomega"
  19. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  20. esv1alpha1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1alpha1"
  21. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  22. )
  23. func TestNewClient(t *testing.T) {
  24. p := &Provider{}
  25. gomega.RegisterTestingT(t)
  26. // nil store
  27. _, err := p.NewClient(context.Background(), nil, nil, "")
  28. gomega.Expect(err).To(gomega.HaveOccurred())
  29. // missing provider
  30. _, err = p.NewClient(context.Background(), &esv1beta1.SecretStore{}, nil, "")
  31. gomega.Expect(err).To(gomega.HaveOccurred())
  32. }
  33. func TestValidateStore(t *testing.T) {
  34. p := &Provider{}
  35. gomega.RegisterTestingT(t)
  36. store := &esv1beta1.SecretStore{
  37. Spec: esv1beta1.SecretStoreSpec{
  38. Provider: &esv1beta1.SecretStoreProvider{
  39. Fake: &esv1beta1.FakeProvider{
  40. Data: []esv1beta1.FakeProviderData{},
  41. },
  42. },
  43. },
  44. }
  45. // empty data must not error
  46. err := p.ValidateStore(store)
  47. gomega.Expect(err).To(gomega.BeNil())
  48. // missing key in data
  49. data := esv1beta1.FakeProviderData{}
  50. data.Version = "v1"
  51. store.Spec.Provider.Fake.Data = []esv1beta1.FakeProviderData{data}
  52. err = p.ValidateStore(store)
  53. gomega.Expect(err).To(gomega.BeEquivalentTo(fmt.Errorf(errMissingKeyField, 0)))
  54. // missing values in data
  55. data.Key = "/foo"
  56. store.Spec.Provider.Fake.Data = []esv1beta1.FakeProviderData{data}
  57. err = p.ValidateStore(store)
  58. gomega.Expect(err).To(gomega.BeEquivalentTo(fmt.Errorf(errMissingValueField, 0)))
  59. // spec ok
  60. data.Value = "bar"
  61. data.ValueMap = map[string]string{"foo": "bar"}
  62. store.Spec.Provider.Fake.Data = []esv1beta1.FakeProviderData{data}
  63. err = p.ValidateStore(store)
  64. gomega.Expect(err).To(gomega.BeNil())
  65. }
  66. func TestClose(t *testing.T) {
  67. p := &Provider{}
  68. gomega.RegisterTestingT(t)
  69. err := p.Close(context.TODO())
  70. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  71. }
  72. type testCase struct {
  73. name string
  74. input []esv1beta1.FakeProviderData
  75. request esv1beta1.ExternalSecretDataRemoteRef
  76. expValue string
  77. expErr string
  78. }
  79. func TestGetSecret(t *testing.T) {
  80. gomega.RegisterTestingT(t)
  81. p := &Provider{}
  82. tbl := []testCase{
  83. {
  84. name: "return err when not found",
  85. input: []esv1beta1.FakeProviderData{},
  86. request: esv1beta1.ExternalSecretDataRemoteRef{
  87. Key: "/foo",
  88. Version: "v2",
  89. },
  90. expErr: esv1beta1.NoSecretErr.Error(),
  91. },
  92. {
  93. name: "get correct value from multiple versions",
  94. input: []esv1beta1.FakeProviderData{
  95. {
  96. Key: "/foo",
  97. Value: "bar2",
  98. Version: "v2",
  99. },
  100. {
  101. Key: "junk",
  102. Value: "xxxxx",
  103. },
  104. {
  105. Key: "/foo",
  106. Value: "bar1",
  107. Version: "v1",
  108. },
  109. },
  110. request: esv1beta1.ExternalSecretDataRemoteRef{
  111. Key: "/foo",
  112. Version: "v2",
  113. },
  114. expValue: "bar2",
  115. },
  116. }
  117. for i, row := range tbl {
  118. t.Run(row.name, func(t *testing.T) {
  119. cl, err := p.NewClient(context.Background(), &esv1beta1.SecretStore{
  120. ObjectMeta: metav1.ObjectMeta{
  121. Name: fmt.Sprintf("secret-store-%v", i),
  122. },
  123. Spec: esv1beta1.SecretStoreSpec{
  124. Provider: &esv1beta1.SecretStoreProvider{
  125. Fake: &esv1beta1.FakeProvider{
  126. Data: row.input,
  127. },
  128. },
  129. },
  130. }, nil, "")
  131. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  132. out, err := cl.GetSecret(context.Background(), row.request)
  133. if row.expErr != "" {
  134. gomega.Expect(err).To(gomega.MatchError(row.expErr))
  135. } else {
  136. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  137. }
  138. gomega.Expect(string(out)).To(gomega.Equal(row.expValue))
  139. })
  140. }
  141. }
  142. type setSecretTestCase struct {
  143. name string
  144. input []esv1beta1.FakeProviderData
  145. requestKey string
  146. expValue string
  147. expErr string
  148. }
  149. func TestSetSecret(t *testing.T) {
  150. gomega.RegisterTestingT(t)
  151. p := &Provider{}
  152. tbl := []setSecretTestCase{
  153. {
  154. name: "return nil if no existing secret",
  155. input: []esv1beta1.FakeProviderData{},
  156. requestKey: "/foo",
  157. expValue: "my-secret-value",
  158. },
  159. {
  160. name: "return err if existing secret",
  161. input: []esv1beta1.FakeProviderData{
  162. {
  163. Key: "/foo",
  164. Value: "bar2",
  165. },
  166. },
  167. requestKey: "/foo",
  168. expErr: errors.New("key already exists").Error(),
  169. },
  170. }
  171. for i, row := range tbl {
  172. t.Run(row.name, func(t *testing.T) {
  173. cl, err := p.NewClient(context.Background(), &esv1beta1.SecretStore{
  174. ObjectMeta: metav1.ObjectMeta{
  175. Name: fmt.Sprintf("secret-store-%v", i),
  176. },
  177. Spec: esv1beta1.SecretStoreSpec{
  178. Provider: &esv1beta1.SecretStoreProvider{
  179. Fake: &esv1beta1.FakeProvider{
  180. Data: row.input,
  181. },
  182. },
  183. },
  184. }, nil, "")
  185. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  186. err = cl.PushSecret(context.TODO(), []byte(row.expValue), esv1alpha1.PushSecretRemoteRef{
  187. RemoteKey: row.requestKey,
  188. })
  189. if row.expErr != "" {
  190. gomega.Expect(err).To(gomega.MatchError(row.expErr))
  191. } else {
  192. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  193. out, err := cl.GetSecret(context.Background(), esv1beta1.ExternalSecretDataRemoteRef{
  194. Key: row.requestKey,
  195. })
  196. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  197. gomega.Expect(string(out)).To(gomega.Equal(row.expValue))
  198. }
  199. })
  200. }
  201. }
  202. type testMapCase struct {
  203. name string
  204. input []esv1beta1.FakeProviderData
  205. request esv1beta1.ExternalSecretDataRemoteRef
  206. expValue map[string][]byte
  207. expErr string
  208. }
  209. func TestGetSecretMap(t *testing.T) {
  210. gomega.RegisterTestingT(t)
  211. p := &Provider{}
  212. tbl := []testMapCase{
  213. {
  214. name: "return err when not found",
  215. input: []esv1beta1.FakeProviderData{},
  216. request: esv1beta1.ExternalSecretDataRemoteRef{
  217. Key: "/foo",
  218. Version: "v2",
  219. },
  220. expErr: esv1beta1.NoSecretErr.Error(),
  221. },
  222. {
  223. name: "get correct value from multiple versions",
  224. input: []esv1beta1.FakeProviderData{
  225. {
  226. Key: "junk",
  227. ValueMap: map[string]string{
  228. "junk": "ok",
  229. },
  230. },
  231. {
  232. Key: "/foo",
  233. ValueMap: map[string]string{
  234. "foo": "bar",
  235. "baz": "bang",
  236. },
  237. Version: "v1",
  238. },
  239. {
  240. Key: "/foo",
  241. ValueMap: map[string]string{
  242. "foo": "bar",
  243. "baz": "bang",
  244. },
  245. Version: "v2",
  246. },
  247. },
  248. request: esv1beta1.ExternalSecretDataRemoteRef{
  249. Key: "/foo",
  250. Version: "v2",
  251. },
  252. expValue: map[string][]byte{
  253. "foo": []byte("bar"),
  254. "baz": []byte("bang"),
  255. },
  256. },
  257. }
  258. for i, row := range tbl {
  259. t.Run(row.name, func(t *testing.T) {
  260. cl, err := p.NewClient(context.Background(), &esv1beta1.SecretStore{
  261. ObjectMeta: metav1.ObjectMeta{
  262. Name: fmt.Sprintf("secret-store-%v", i),
  263. },
  264. Spec: esv1beta1.SecretStoreSpec{
  265. Provider: &esv1beta1.SecretStoreProvider{
  266. Fake: &esv1beta1.FakeProvider{
  267. Data: row.input,
  268. },
  269. },
  270. },
  271. }, nil, "")
  272. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  273. out, err := cl.GetSecretMap(context.Background(), row.request)
  274. if row.expErr != "" {
  275. gomega.Expect(err).To(gomega.MatchError(row.expErr))
  276. } else {
  277. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  278. }
  279. gomega.Expect(out).To(gomega.Equal(row.expValue))
  280. })
  281. }
  282. }