fake.go 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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. "errors"
  15. "fmt"
  16. "github.com/1Password/connect-sdk-go/onepassword"
  17. )
  18. // OnePasswordMockClient is a fake connect.Client.
  19. type OnePasswordMockClient struct {
  20. MockVaults map[string][]onepassword.Vault
  21. MockItems map[string][]onepassword.Item // ID and Title only
  22. MockItemFields map[string]map[string][]*onepassword.ItemField
  23. MockFileContents map[string][]byte
  24. }
  25. // NewMockClient returns an instantiated mock client.
  26. func NewMockClient() *OnePasswordMockClient {
  27. return &OnePasswordMockClient{
  28. MockVaults: map[string][]onepassword.Vault{},
  29. MockItems: map[string][]onepassword.Item{},
  30. MockItemFields: map[string]map[string][]*onepassword.ItemField{},
  31. MockFileContents: map[string][]byte{},
  32. }
  33. }
  34. // GetVaults unused fake.
  35. func (mockClient *OnePasswordMockClient) GetVaults() ([]onepassword.Vault, error) {
  36. return []onepassword.Vault{}, nil
  37. }
  38. // GetVault unused fake.
  39. func (mockClient *OnePasswordMockClient) GetVault(uuid string) (*onepassword.Vault, error) {
  40. return &onepassword.Vault{}, nil
  41. }
  42. // GetVaultByUUID unused fake.
  43. func (mockClient *OnePasswordMockClient) GetVaultByUUID(uuid string) (*onepassword.Vault, error) {
  44. return &onepassword.Vault{}, nil
  45. }
  46. // GetVaultByTitle returns a vault, you must preload, only one.
  47. func (mockClient *OnePasswordMockClient) GetVaultByTitle(uuid string) (*onepassword.Vault, error) {
  48. if len(mockClient.MockVaults[uuid]) != 0 {
  49. return &mockClient.MockVaults[uuid][0], nil
  50. }
  51. return &onepassword.Vault{}, nil
  52. }
  53. // GetVaultsByTitle returns a list of vaults, you must preload.
  54. func (mockClient *OnePasswordMockClient) GetVaultsByTitle(uuid string) ([]onepassword.Vault, error) {
  55. return mockClient.MockVaults[uuid], nil
  56. }
  57. // GetItems returns []onepassword.Item, you must preload.
  58. func (mockClient *OnePasswordMockClient) GetItems(vaultUUID string) ([]onepassword.Item, error) {
  59. return mockClient.MockItems[vaultUUID], nil
  60. }
  61. // GetItem returns a *onepassword.Item, you must preload.
  62. func (mockClient *OnePasswordMockClient) GetItem(itemUUID, vaultUUID string) (*onepassword.Item, error) {
  63. for _, item := range mockClient.MockItems[vaultUUID] {
  64. if item.ID == itemUUID {
  65. // load the fields that GetItemsByTitle does not
  66. item.Fields = mockClient.MockItemFields[vaultUUID][itemUUID]
  67. return &item, nil
  68. }
  69. }
  70. return &onepassword.Item{}, errors.New("status 400: Invalid Item UUID")
  71. }
  72. // GetItemByUUID returns a *onepassword.Item, you must preload.
  73. func (mockClient *OnePasswordMockClient) GetItemByUUID(itemUUID, vaultUUID string) (*onepassword.Item, error) {
  74. for _, item := range mockClient.MockItems[vaultUUID] {
  75. if item.ID == itemUUID {
  76. // load the fields that GetItemsByTitle does not
  77. item.Fields = mockClient.MockItemFields[vaultUUID][itemUUID]
  78. return &item, nil
  79. }
  80. }
  81. return &onepassword.Item{}, errors.New("status 400: Invalid Item UUID")
  82. }
  83. // GetItemByTitle unused fake.
  84. func (mockClient *OnePasswordMockClient) GetItemByTitle(title, vaultUUID string) (*onepassword.Item, error) {
  85. return &onepassword.Item{}, nil
  86. }
  87. // GetItemsByTitle returns a list of items, you must preload.
  88. func (mockClient *OnePasswordMockClient) GetItemsByTitle(itemUUID, vaultUUID string) ([]onepassword.Item, error) {
  89. items := []onepassword.Item{}
  90. for _, item := range mockClient.MockItems[vaultUUID] {
  91. if item.Title == itemUUID {
  92. items = append(items, item)
  93. }
  94. }
  95. return items, nil
  96. }
  97. // CreateItem unused fake.
  98. func (mockClient *OnePasswordMockClient) CreateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) {
  99. return &onepassword.Item{}, nil
  100. }
  101. // UpdateItem unused fake.
  102. func (mockClient *OnePasswordMockClient) UpdateItem(item *onepassword.Item, vaultUUID string) (*onepassword.Item, error) {
  103. return &onepassword.Item{}, nil
  104. }
  105. // DeleteItem unused fake.
  106. func (mockClient *OnePasswordMockClient) DeleteItem(item *onepassword.Item, vaultUUID string) error {
  107. return nil
  108. }
  109. // DeleteItemByID unused fake.
  110. func (mockClient *OnePasswordMockClient) DeleteItemByID(itemUUID, vaultQuery string) error {
  111. return nil
  112. }
  113. // DeleteItemByTitle unused fake.
  114. func (mockClient *OnePasswordMockClient) DeleteItemByTitle(title, vaultQuery string) error {
  115. return nil
  116. }
  117. // GetFiles unused fake.
  118. func (mockClient *OnePasswordMockClient) GetFiles(itemQuery, vaultQuery string) ([]onepassword.File, error) {
  119. return []onepassword.File{}, nil
  120. }
  121. // GetFile unused fake.
  122. func (mockClient *OnePasswordMockClient) GetFile(fileUUID, itemUUID, vaultUUID string) (*onepassword.File, error) {
  123. return &onepassword.File{}, nil
  124. }
  125. // GetFileContent returns file data, you must preload.
  126. func (mockClient *OnePasswordMockClient) GetFileContent(file *onepassword.File) ([]byte, error) {
  127. value, ok := mockClient.MockFileContents[file.Name]
  128. if !ok {
  129. return []byte{}, errors.New("status 400: Invalid File Name")
  130. }
  131. return value, nil
  132. }
  133. // DownloadFile unused fake.
  134. func (mockClient *OnePasswordMockClient) DownloadFile(file *onepassword.File, targetDirectory string, overwrite bool) (string, error) {
  135. return "", nil
  136. }
  137. // LoadStructFromItemByUUID unused fake.
  138. func (mockClient *OnePasswordMockClient) LoadStructFromItemByUUID(config interface{}, itemUUID, vaultQuery string) error {
  139. return nil
  140. }
  141. // LoadStructFromItemByTitle unused fake.
  142. func (mockClient *OnePasswordMockClient) LoadStructFromItemByTitle(config interface{}, itemTitle, vaultQuery string) error {
  143. return nil
  144. }
  145. // LoadStructFromItem unused fake.
  146. func (mockClient *OnePasswordMockClient) LoadStructFromItem(config interface{}, itemQuery, vaultQuery string) error {
  147. return nil
  148. }
  149. // LoadStructunused fake.
  150. func (mockClient *OnePasswordMockClient) LoadStruct(config interface{}) error {
  151. return nil
  152. }
  153. // // For rigging test cases
  154. // AddPredictableVault adds vaults to the mock client in a predictable way.
  155. func (mockClient *OnePasswordMockClient) AddPredictableVault(name string) *OnePasswordMockClient {
  156. mockClient.MockVaults[name] = append(mockClient.MockVaults[name], onepassword.Vault{
  157. ID: fmt.Sprintf("%s-id", name),
  158. Name: name,
  159. })
  160. return mockClient
  161. }
  162. // AddPredictableItemWithField adds an item and it's fields to the mock client in a predictable way.
  163. func (mockClient *OnePasswordMockClient) AddPredictableItemWithField(vaultName, title, label, value string) *OnePasswordMockClient {
  164. itemID := fmt.Sprintf("%s-id", title)
  165. vaultID := fmt.Sprintf("%s-id", vaultName)
  166. mockClient.MockItems[vaultID] = append(mockClient.MockItems[vaultID], onepassword.Item{
  167. ID: itemID,
  168. Title: title,
  169. Vault: onepassword.ItemVault{ID: vaultID},
  170. })
  171. if mockClient.MockItemFields[vaultID] == nil {
  172. mockClient.MockItemFields[vaultID] = make(map[string][]*onepassword.ItemField)
  173. }
  174. mockClient.MockItemFields[vaultID][itemID] = append(mockClient.MockItemFields[vaultID][itemID], &onepassword.ItemField{
  175. Label: label,
  176. Value: value,
  177. })
  178. return mockClient
  179. }
  180. // AppendVault appends a onepassword.Vault to the mock client.
  181. func (mockClient *OnePasswordMockClient) AppendVault(name string, vault onepassword.Vault) *OnePasswordMockClient {
  182. mockClient.MockVaults[name] = append(mockClient.MockVaults[name], vault)
  183. return mockClient
  184. }
  185. // AppendItem appends a onepassword.Item to the mock client.
  186. func (mockClient *OnePasswordMockClient) AppendItem(vaultID string, item onepassword.Item) *OnePasswordMockClient {
  187. mockClient.MockItems[vaultID] = append(mockClient.MockItems[vaultID], item)
  188. return mockClient
  189. }
  190. // AppendItemField appends a onepassword.ItemField to the mock client.
  191. func (mockClient *OnePasswordMockClient) AppendItemField(vaultID, itemID string, itemField onepassword.ItemField) *OnePasswordMockClient {
  192. if mockClient.MockItemFields[vaultID] == nil {
  193. mockClient.MockItemFields[vaultID] = make(map[string][]*onepassword.ItemField)
  194. }
  195. mockClient.MockItemFields[vaultID][itemID] = append(mockClient.MockItemFields[vaultID][itemID], &itemField)
  196. return mockClient
  197. }
  198. // SetFileContents adds file contents to the mock client.
  199. func (mockClient *OnePasswordMockClient) SetFileContents(name string, contents []byte) *OnePasswordMockClient {
  200. // no need to test or mock same file names in different vaults, because we only GetFileContent after findItem, which already tests getting the right item from the right vault
  201. mockClient.MockFileContents[name] = contents
  202. return mockClient
  203. }