fake_test.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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. name: "get correct value from multiple properties",
  118. input: []esv1beta1.FakeProviderData{
  119. {
  120. Key: "junk",
  121. Value: "xxxxx",
  122. },
  123. {
  124. Key: "/foo",
  125. Value: `{"p1":"bar","p2":"bar2"}`,
  126. },
  127. },
  128. request: esv1beta1.ExternalSecretDataRemoteRef{
  129. Key: "/foo",
  130. Property: "p2",
  131. },
  132. expValue: "bar2",
  133. },
  134. }
  135. for i, row := range tbl {
  136. t.Run(row.name, func(t *testing.T) {
  137. cl, err := p.NewClient(context.Background(), &esv1beta1.SecretStore{
  138. ObjectMeta: metav1.ObjectMeta{
  139. Name: fmt.Sprintf("secret-store-%v", i),
  140. },
  141. Spec: esv1beta1.SecretStoreSpec{
  142. Provider: &esv1beta1.SecretStoreProvider{
  143. Fake: &esv1beta1.FakeProvider{
  144. Data: row.input,
  145. },
  146. },
  147. },
  148. }, nil, "")
  149. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  150. out, err := cl.GetSecret(context.Background(), row.request)
  151. if row.expErr != "" {
  152. gomega.Expect(err).To(gomega.MatchError(row.expErr))
  153. } else {
  154. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  155. }
  156. gomega.Expect(string(out)).To(gomega.Equal(row.expValue))
  157. })
  158. }
  159. }
  160. type setSecretTestCase struct {
  161. name string
  162. input []esv1beta1.FakeProviderData
  163. requestKey string
  164. expValue string
  165. expErr string
  166. }
  167. func TestSetSecret(t *testing.T) {
  168. gomega.RegisterTestingT(t)
  169. p := &Provider{}
  170. tbl := []setSecretTestCase{
  171. {
  172. name: "return nil if no existing secret",
  173. input: []esv1beta1.FakeProviderData{},
  174. requestKey: "/foo",
  175. expValue: "my-secret-value",
  176. },
  177. {
  178. name: "return err if existing secret",
  179. input: []esv1beta1.FakeProviderData{
  180. {
  181. Key: "/foo",
  182. Value: "bar2",
  183. },
  184. },
  185. requestKey: "/foo",
  186. expErr: errors.New("key already exists").Error(),
  187. },
  188. }
  189. for i, row := range tbl {
  190. t.Run(row.name, func(t *testing.T) {
  191. cl, err := p.NewClient(context.Background(), &esv1beta1.SecretStore{
  192. ObjectMeta: metav1.ObjectMeta{
  193. Name: fmt.Sprintf("secret-store-%v", i),
  194. },
  195. Spec: esv1beta1.SecretStoreSpec{
  196. Provider: &esv1beta1.SecretStoreProvider{
  197. Fake: &esv1beta1.FakeProvider{
  198. Data: row.input,
  199. },
  200. },
  201. },
  202. }, nil, "")
  203. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  204. err = cl.PushSecret(context.TODO(), []byte(row.expValue), nil, esv1alpha1.PushSecretRemoteRef{
  205. RemoteKey: row.requestKey,
  206. })
  207. if row.expErr != "" {
  208. gomega.Expect(err).To(gomega.MatchError(row.expErr))
  209. } else {
  210. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  211. out, err := cl.GetSecret(context.Background(), esv1beta1.ExternalSecretDataRemoteRef{
  212. Key: row.requestKey,
  213. })
  214. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  215. gomega.Expect(string(out)).To(gomega.Equal(row.expValue))
  216. }
  217. })
  218. }
  219. }
  220. type testMapCase struct {
  221. name string
  222. input []esv1beta1.FakeProviderData
  223. request esv1beta1.ExternalSecretDataRemoteRef
  224. expValue map[string][]byte
  225. expErr string
  226. }
  227. func TestGetSecretMap(t *testing.T) {
  228. gomega.RegisterTestingT(t)
  229. p := &Provider{}
  230. tbl := []testMapCase{
  231. {
  232. name: "return err when not found",
  233. input: []esv1beta1.FakeProviderData{},
  234. request: esv1beta1.ExternalSecretDataRemoteRef{
  235. Key: "/foo",
  236. Version: "v2",
  237. },
  238. expErr: esv1beta1.NoSecretErr.Error(),
  239. },
  240. {
  241. name: "get correct value from multiple versions",
  242. input: []esv1beta1.FakeProviderData{
  243. {
  244. Key: "junk",
  245. ValueMap: map[string]string{
  246. "junk": "ok",
  247. },
  248. },
  249. {
  250. Key: "/foo",
  251. ValueMap: map[string]string{
  252. "foo": "bar",
  253. "baz": "bang",
  254. },
  255. Version: "v1",
  256. },
  257. {
  258. Key: "/foo",
  259. ValueMap: map[string]string{
  260. "foo": "bar",
  261. "baz": "bang",
  262. },
  263. Version: "v2",
  264. },
  265. },
  266. request: esv1beta1.ExternalSecretDataRemoteRef{
  267. Key: "/foo",
  268. Version: "v2",
  269. },
  270. expValue: map[string][]byte{
  271. "foo": []byte("bar"),
  272. "baz": []byte("bang"),
  273. },
  274. },
  275. }
  276. for i, row := range tbl {
  277. t.Run(row.name, func(t *testing.T) {
  278. cl, err := p.NewClient(context.Background(), &esv1beta1.SecretStore{
  279. ObjectMeta: metav1.ObjectMeta{
  280. Name: fmt.Sprintf("secret-store-%v", i),
  281. },
  282. Spec: esv1beta1.SecretStoreSpec{
  283. Provider: &esv1beta1.SecretStoreProvider{
  284. Fake: &esv1beta1.FakeProvider{
  285. Data: row.input,
  286. },
  287. },
  288. },
  289. }, nil, "")
  290. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  291. out, err := cl.GetSecretMap(context.Background(), row.request)
  292. if row.expErr != "" {
  293. gomega.Expect(err).To(gomega.MatchError(row.expErr))
  294. } else {
  295. gomega.Expect(err).ToNot(gomega.HaveOccurred())
  296. }
  297. gomega.Expect(out).To(gomega.Equal(row.expValue))
  298. })
  299. }
  300. }