/variable_integration_test.go

https://github.com/hashicorp/go-tfe · Go · 330 lines · 259 code · 64 blank · 7 comment · 9 complexity · 77227a4e0b3f08a8e3fbed0f5e22c495 MD5 · raw file

  1. //go:build integration
  2. // +build integration
  3. package tfe
  4. import (
  5. "context"
  6. "testing"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func TestVariablesList(t *testing.T) {
  11. client := testClient(t)
  12. ctx := context.Background()
  13. orgTest, orgTestCleanup := createOrganization(t, client)
  14. defer orgTestCleanup()
  15. wTest, wTestCleanup := createWorkspace(t, client, orgTest)
  16. defer wTestCleanup()
  17. vTest1, vTestCleanup1 := createVariable(t, client, wTest)
  18. defer vTestCleanup1()
  19. vTest2, vTestCleanup2 := createVariable(t, client, wTest)
  20. defer vTestCleanup2()
  21. t.Run("without list options", func(t *testing.T) {
  22. vl, err := client.Variables.List(ctx, wTest.ID, VariableListOptions{})
  23. require.NoError(t, err)
  24. assert.Contains(t, vl.Items, vTest1)
  25. assert.Contains(t, vl.Items, vTest2)
  26. t.Skip("paging not supported yet in API")
  27. assert.Equal(t, 1, vl.CurrentPage)
  28. assert.Equal(t, 2, vl.TotalCount)
  29. })
  30. t.Run("with list options", func(t *testing.T) {
  31. t.Skip("paging not supported yet in API")
  32. // Request a page number which is out of range. The result should
  33. // be successful, but return no results if the paging options are
  34. // properly passed along.
  35. vl, err := client.Variables.List(ctx, wTest.ID, VariableListOptions{
  36. ListOptions: ListOptions{
  37. PageNumber: 999,
  38. PageSize: 100,
  39. },
  40. })
  41. require.NoError(t, err)
  42. assert.Empty(t, vl.Items)
  43. assert.Equal(t, 999, vl.CurrentPage)
  44. assert.Equal(t, 2, vl.TotalCount)
  45. })
  46. t.Run("when workspace ID is invalid ID", func(t *testing.T) {
  47. vl, err := client.Variables.List(ctx, badIdentifier, VariableListOptions{})
  48. assert.Nil(t, vl)
  49. assert.EqualError(t, err, ErrInvalidWorkspaceID.Error())
  50. })
  51. }
  52. func TestVariablesCreate(t *testing.T) {
  53. client := testClient(t)
  54. ctx := context.Background()
  55. wTest, wTestCleanup := createWorkspace(t, client, nil)
  56. defer wTestCleanup()
  57. t.Run("with valid options", func(t *testing.T) {
  58. options := VariableCreateOptions{
  59. Key: String(randomString(t)),
  60. Value: String(randomString(t)),
  61. Category: Category(CategoryTerraform),
  62. Description: String(randomString(t)),
  63. }
  64. v, err := client.Variables.Create(ctx, wTest.ID, options)
  65. require.NoError(t, err)
  66. assert.NotEmpty(t, v.ID)
  67. assert.Equal(t, *options.Key, v.Key)
  68. assert.Equal(t, *options.Value, v.Value)
  69. assert.Equal(t, *options.Description, v.Description)
  70. assert.Equal(t, *options.Category, v.Category)
  71. // The workspace isn't returned correcly by the API.
  72. // assert.Equal(t, *options.Workspace, v.Workspace)
  73. })
  74. t.Run("when options has an empty string value", func(t *testing.T) {
  75. options := VariableCreateOptions{
  76. Key: String(randomString(t)),
  77. Value: String(""),
  78. Description: String(randomString(t)),
  79. Category: Category(CategoryTerraform),
  80. }
  81. v, err := client.Variables.Create(ctx, wTest.ID, options)
  82. require.NoError(t, err)
  83. assert.NotEmpty(t, v.ID)
  84. assert.Equal(t, *options.Key, v.Key)
  85. assert.Equal(t, *options.Value, v.Value)
  86. assert.Equal(t, *options.Description, v.Description)
  87. assert.Equal(t, *options.Category, v.Category)
  88. })
  89. t.Run("when options has an empty string description", func(t *testing.T) {
  90. options := VariableCreateOptions{
  91. Key: String(randomString(t)),
  92. Value: String(randomString(t)),
  93. Description: String(""),
  94. Category: Category(CategoryTerraform),
  95. }
  96. v, err := client.Variables.Create(ctx, wTest.ID, options)
  97. require.NoError(t, err)
  98. assert.NotEmpty(t, v.ID)
  99. assert.Equal(t, *options.Key, v.Key)
  100. assert.Equal(t, *options.Value, v.Value)
  101. assert.Equal(t, *options.Description, v.Description)
  102. assert.Equal(t, *options.Category, v.Category)
  103. })
  104. t.Run("when options has a too-long description", func(t *testing.T) {
  105. options := VariableCreateOptions{
  106. Key: String(randomString(t)),
  107. Value: String(randomString(t)),
  108. Description: String("tortor aliquam nulla facilisi cras fermentum odio eu feugiat pretium nibh ipsum consequat nisl vel pretium lectus quam id leo in vitae turpis massa sed elementum tempus egestas sed sed risus pretium quam vulputate dignissim suspendisse in est ante in nibh mauris cursus mattis molestie a iaculis at erat pellentesque adipiscing commodo elit at imperdiet dui accumsan sit amet nulla facilisi morbi tempus iaculis urna id volutpat lacus laoreet non curabitur gravida arcu ac tortor dignissim convallis aenean et tortor"),
  109. Category: Category(CategoryTerraform),
  110. }
  111. _, err := client.Variables.Create(ctx, wTest.ID, options)
  112. assert.Error(t, err)
  113. })
  114. t.Run("when options is missing value", func(t *testing.T) {
  115. options := VariableCreateOptions{
  116. Key: String(randomString(t)),
  117. Category: Category(CategoryTerraform),
  118. }
  119. v, err := client.Variables.Create(ctx, wTest.ID, options)
  120. require.NoError(t, err)
  121. assert.NotEmpty(t, v.ID)
  122. assert.Equal(t, *options.Key, v.Key)
  123. assert.Equal(t, "", v.Value)
  124. assert.Equal(t, *options.Category, v.Category)
  125. })
  126. t.Run("when options is missing key", func(t *testing.T) {
  127. options := VariableCreateOptions{
  128. Value: String(randomString(t)),
  129. Category: Category(CategoryTerraform),
  130. }
  131. _, err := client.Variables.Create(ctx, wTest.ID, options)
  132. assert.EqualError(t, err, "key is required")
  133. })
  134. t.Run("when options has an empty key", func(t *testing.T) {
  135. options := VariableCreateOptions{
  136. Key: String(""),
  137. Value: String(randomString(t)),
  138. Category: Category(CategoryTerraform),
  139. }
  140. _, err := client.Variables.Create(ctx, wTest.ID, options)
  141. assert.EqualError(t, err, "key is required")
  142. })
  143. t.Run("when options is missing category", func(t *testing.T) {
  144. options := VariableCreateOptions{
  145. Key: String(randomString(t)),
  146. Value: String(randomString(t)),
  147. }
  148. _, err := client.Variables.Create(ctx, wTest.ID, options)
  149. assert.EqualError(t, err, "category is required")
  150. })
  151. t.Run("when workspace ID is invalid", func(t *testing.T) {
  152. options := VariableCreateOptions{
  153. Key: String(randomString(t)),
  154. Value: String(randomString(t)),
  155. Category: Category(CategoryTerraform),
  156. }
  157. _, err := client.Variables.Create(ctx, badIdentifier, options)
  158. assert.EqualError(t, err, ErrInvalidWorkspaceID.Error())
  159. })
  160. }
  161. func TestVariablesRead(t *testing.T) {
  162. client := testClient(t)
  163. ctx := context.Background()
  164. vTest, vTestCleanup := createVariable(t, client, nil)
  165. defer vTestCleanup()
  166. t.Run("when the variable exists", func(t *testing.T) {
  167. v, err := client.Variables.Read(ctx, vTest.Workspace.ID, vTest.ID)
  168. require.NoError(t, err)
  169. assert.Equal(t, vTest.ID, v.ID)
  170. assert.Equal(t, vTest.Category, v.Category)
  171. assert.Equal(t, vTest.HCL, v.HCL)
  172. assert.Equal(t, vTest.Key, v.Key)
  173. assert.Equal(t, vTest.Sensitive, v.Sensitive)
  174. assert.Equal(t, vTest.Value, v.Value)
  175. })
  176. t.Run("when the variable does not exist", func(t *testing.T) {
  177. v, err := client.Variables.Read(ctx, vTest.Workspace.ID, "nonexisting")
  178. assert.Nil(t, v)
  179. assert.Equal(t, ErrResourceNotFound, err)
  180. })
  181. t.Run("without a valid workspace ID", func(t *testing.T) {
  182. v, err := client.Variables.Read(ctx, badIdentifier, vTest.ID)
  183. assert.Nil(t, v)
  184. assert.EqualError(t, err, ErrInvalidWorkspaceID.Error())
  185. })
  186. t.Run("without a valid variable ID", func(t *testing.T) {
  187. v, err := client.Variables.Read(ctx, vTest.Workspace.ID, badIdentifier)
  188. assert.Nil(t, v)
  189. assert.EqualError(t, err, "invalid value for variable ID")
  190. })
  191. }
  192. func TestVariablesUpdate(t *testing.T) {
  193. client := testClient(t)
  194. ctx := context.Background()
  195. vTest, vTestCleanup := createVariable(t, client, nil)
  196. defer vTestCleanup()
  197. t.Run("with valid options", func(t *testing.T) {
  198. options := VariableUpdateOptions{
  199. Key: String("newname"),
  200. Value: String("newvalue"),
  201. HCL: Bool(true),
  202. }
  203. v, err := client.Variables.Update(ctx, vTest.Workspace.ID, vTest.ID, options)
  204. require.NoError(t, err)
  205. assert.Equal(t, *options.Key, v.Key)
  206. assert.Equal(t, *options.HCL, v.HCL)
  207. assert.Equal(t, *options.Value, v.Value)
  208. })
  209. t.Run("when updating a subset of values", func(t *testing.T) {
  210. options := VariableUpdateOptions{
  211. Key: String("someothername"),
  212. HCL: Bool(false),
  213. }
  214. v, err := client.Variables.Update(ctx, vTest.Workspace.ID, vTest.ID, options)
  215. require.NoError(t, err)
  216. assert.Equal(t, *options.Key, v.Key)
  217. assert.Equal(t, *options.HCL, v.HCL)
  218. })
  219. t.Run("with sensitive set", func(t *testing.T) {
  220. options := VariableUpdateOptions{
  221. Sensitive: Bool(true),
  222. }
  223. v, err := client.Variables.Update(ctx, vTest.Workspace.ID, vTest.ID, options)
  224. require.NoError(t, err)
  225. assert.Equal(t, *options.Sensitive, v.Sensitive)
  226. assert.Empty(t, v.Value) // Because its now sensitive
  227. })
  228. t.Run("without any changes", func(t *testing.T) {
  229. vTest, vTestCleanup := createVariable(t, client, nil)
  230. defer vTestCleanup()
  231. v, err := client.Variables.Update(ctx, vTest.Workspace.ID, vTest.ID, VariableUpdateOptions{})
  232. require.NoError(t, err)
  233. assert.Equal(t, vTest, v)
  234. })
  235. t.Run("with invalid variable ID", func(t *testing.T) {
  236. _, err := client.Variables.Update(ctx, badIdentifier, vTest.ID, VariableUpdateOptions{})
  237. assert.EqualError(t, err, ErrInvalidWorkspaceID.Error())
  238. })
  239. t.Run("with invalid variable ID", func(t *testing.T) {
  240. _, err := client.Variables.Update(ctx, vTest.Workspace.ID, badIdentifier, VariableUpdateOptions{})
  241. assert.EqualError(t, err, "invalid value for variable ID")
  242. })
  243. }
  244. func TestVariablesDelete(t *testing.T) {
  245. client := testClient(t)
  246. ctx := context.Background()
  247. wTest, wTestCleanup := createWorkspace(t, client, nil)
  248. defer wTestCleanup()
  249. vTest, _ := createVariable(t, client, wTest)
  250. t.Run("with valid options", func(t *testing.T) {
  251. err := client.Variables.Delete(ctx, wTest.ID, vTest.ID)
  252. assert.NoError(t, err)
  253. })
  254. t.Run("with non existing variable ID", func(t *testing.T) {
  255. err := client.Variables.Delete(ctx, wTest.ID, "nonexisting")
  256. assert.Equal(t, err, ErrResourceNotFound)
  257. })
  258. t.Run("with invalid workspace ID", func(t *testing.T) {
  259. err := client.Variables.Delete(ctx, badIdentifier, vTest.ID)
  260. assert.EqualError(t, err, ErrInvalidWorkspaceID.Error())
  261. })
  262. t.Run("with invalid variable ID", func(t *testing.T) {
  263. err := client.Variables.Delete(ctx, wTest.ID, badIdentifier)
  264. assert.EqualError(t, err, "invalid value for variable ID")
  265. })
  266. }