integration_test.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. // Copyright 2017 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. // +build integration
  5. package main
  6. import (
  7. "math/rand"
  8. "strconv"
  9. "strings"
  10. "testing"
  11. "time"
  12. "github.com/miniflux/miniflux-go"
  13. )
  14. const (
  15. testBaseURL = "http://127.0.0.1:8080"
  16. testAdminUsername = "admin"
  17. testAdminPassword = "test123"
  18. testStandardPassword = "secret"
  19. )
  20. func TestWithBadEndpoint(t *testing.T) {
  21. client := miniflux.NewClient("bad url", testAdminUsername, testAdminPassword)
  22. _, err := client.Users()
  23. if err == nil {
  24. t.Fatal(`Using a bad url should raise an error`)
  25. }
  26. }
  27. func TestWithWrongCredentials(t *testing.T) {
  28. client := miniflux.NewClient(testBaseURL, "invalid", "invalid")
  29. _, err := client.Users()
  30. if err == nil {
  31. t.Fatal(`Using bad credentials should raise an error`)
  32. }
  33. }
  34. func TestGetUsers(t *testing.T) {
  35. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  36. users, err := client.Users()
  37. if err != nil {
  38. t.Fatal(err)
  39. }
  40. if len(users) == 0 {
  41. t.Fatal("The list of users is empty")
  42. }
  43. if users[0].ID == 0 {
  44. t.Fatalf(`Invalid userID, got "%v"`, users[0].ID)
  45. }
  46. if users[0].Username != testAdminUsername {
  47. t.Fatalf(`Invalid username, got "%v" instead of "%v"`, users[0].Username, testAdminUsername)
  48. }
  49. if users[0].Password != "" {
  50. t.Fatalf(`Invalid password, got "%v"`, users[0].Password)
  51. }
  52. if users[0].Language != "en_US" {
  53. t.Fatalf(`Invalid language, got "%v"`, users[0].Language)
  54. }
  55. if users[0].Theme != "default" {
  56. t.Fatalf(`Invalid theme, got "%v"`, users[0].Theme)
  57. }
  58. if users[0].Timezone != "UTC" {
  59. t.Fatalf(`Invalid timezone, got "%v"`, users[0].Timezone)
  60. }
  61. if !users[0].IsAdmin {
  62. t.Fatalf(`Invalid role, got "%v"`, users[0].IsAdmin)
  63. }
  64. }
  65. func TestCreateStandardUser(t *testing.T) {
  66. username := getRandomUsername()
  67. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  68. user, err := client.CreateUser(username, testStandardPassword, false)
  69. if err != nil {
  70. t.Fatal(err)
  71. }
  72. if user.ID == 0 {
  73. t.Fatalf(`Invalid userID, got "%v"`, user.ID)
  74. }
  75. if user.Username != username {
  76. t.Fatalf(`Invalid username, got "%v" instead of "%v"`, user.Username, username)
  77. }
  78. if user.Password != "" {
  79. t.Fatalf(`Invalid password, got "%v"`, user.Password)
  80. }
  81. if user.Language != "en_US" {
  82. t.Fatalf(`Invalid language, got "%v"`, user.Language)
  83. }
  84. if user.Theme != "default" {
  85. t.Fatalf(`Invalid theme, got "%v"`, user.Theme)
  86. }
  87. if user.Timezone != "UTC" {
  88. t.Fatalf(`Invalid timezone, got "%v"`, user.Timezone)
  89. }
  90. if user.IsAdmin {
  91. t.Fatalf(`Invalid role, got "%v"`, user.IsAdmin)
  92. }
  93. if user.LastLoginAt != nil {
  94. t.Fatalf(`Invalid last login date, got "%v"`, user.LastLoginAt)
  95. }
  96. }
  97. func TestRemoveUser(t *testing.T) {
  98. username := getRandomUsername()
  99. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  100. user, err := client.CreateUser(username, testStandardPassword, false)
  101. if err != nil {
  102. t.Fatal(err)
  103. }
  104. if err := client.DeleteUser(user.ID); err != nil {
  105. t.Fatalf(`Unable to remove user: "%v"`, err)
  106. }
  107. }
  108. func TestGetUser(t *testing.T) {
  109. username := getRandomUsername()
  110. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  111. user, err := client.CreateUser(username, testStandardPassword, false)
  112. if err != nil {
  113. t.Fatal(err)
  114. }
  115. user, err = client.User(user.ID)
  116. if err != nil {
  117. t.Fatal(err)
  118. }
  119. if user.ID == 0 {
  120. t.Fatalf(`Invalid userID, got "%v"`, user.ID)
  121. }
  122. if user.Username != username {
  123. t.Fatalf(`Invalid username, got "%v" instead of "%v"`, user.Username, username)
  124. }
  125. if user.Password != "" {
  126. t.Fatalf(`Invalid password, got "%v"`, user.Password)
  127. }
  128. if user.Language != "en_US" {
  129. t.Fatalf(`Invalid language, got "%v"`, user.Language)
  130. }
  131. if user.Theme != "default" {
  132. t.Fatalf(`Invalid theme, got "%v"`, user.Theme)
  133. }
  134. if user.Timezone != "UTC" {
  135. t.Fatalf(`Invalid timezone, got "%v"`, user.Timezone)
  136. }
  137. if user.IsAdmin {
  138. t.Fatalf(`Invalid role, got "%v"`, user.IsAdmin)
  139. }
  140. if user.LastLoginAt != nil {
  141. t.Fatalf(`Invalid last login date, got "%v"`, user.LastLoginAt)
  142. }
  143. }
  144. func TestUpdateUser(t *testing.T) {
  145. username := getRandomUsername()
  146. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  147. user, err := client.CreateUser(username, testStandardPassword, false)
  148. if err != nil {
  149. t.Fatal(err)
  150. }
  151. theme := "black"
  152. user.Theme = theme
  153. user, err = client.UpdateUser(user)
  154. if err != nil {
  155. t.Fatal(err)
  156. }
  157. if user.Theme != theme {
  158. t.Fatalf(`Unable to update user: got "%v" instead of "%v"`, user.Theme, theme)
  159. }
  160. }
  161. func TestUpdateUserWithInvalidValue(t *testing.T) {
  162. username := getRandomUsername()
  163. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  164. user, err := client.CreateUser(username, testStandardPassword, false)
  165. if err != nil {
  166. t.Fatal(err)
  167. }
  168. theme := "something that doesn't exists"
  169. user.Theme = theme
  170. _, err = client.UpdateUser(user)
  171. if err == nil {
  172. t.Fatal(`Updating a user with an invalid value should raise an error`)
  173. }
  174. }
  175. func TestCannotCreateDuplicateUser(t *testing.T) {
  176. username := getRandomUsername()
  177. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  178. _, err := client.CreateUser(username, testStandardPassword, false)
  179. if err != nil {
  180. t.Fatal(err)
  181. }
  182. _, err = client.CreateUser(username, testStandardPassword, false)
  183. if err == nil {
  184. t.Fatal(`Duplicate users should not be allowed`)
  185. }
  186. }
  187. func TestCannotListUsersAsNonAdmin(t *testing.T) {
  188. username := getRandomUsername()
  189. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  190. _, err := client.CreateUser(username, testStandardPassword, false)
  191. if err != nil {
  192. t.Fatal(err)
  193. }
  194. client = miniflux.NewClient(testBaseURL, username, testStandardPassword)
  195. _, err = client.Users()
  196. if err == nil {
  197. t.Fatal(`Standard users should not be able to list any users`)
  198. }
  199. }
  200. func TestCannotGetUserAsNonAdmin(t *testing.T) {
  201. username := getRandomUsername()
  202. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  203. user, err := client.CreateUser(username, testStandardPassword, false)
  204. if err != nil {
  205. t.Fatal(err)
  206. }
  207. client = miniflux.NewClient(testBaseURL, username, testStandardPassword)
  208. _, err = client.User(user.ID)
  209. if err == nil {
  210. t.Fatal(`Standard users should not be able to get any users`)
  211. }
  212. }
  213. func TestCannotUpdateUserAsNonAdmin(t *testing.T) {
  214. username := getRandomUsername()
  215. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  216. user, err := client.CreateUser(username, testStandardPassword, false)
  217. if err != nil {
  218. t.Fatal(err)
  219. }
  220. client = miniflux.NewClient(testBaseURL, username, testStandardPassword)
  221. _, err = client.UpdateUser(user)
  222. if err == nil {
  223. t.Fatal(`Standard users should not be able to update any users`)
  224. }
  225. }
  226. func TestCannotCreateUserAsNonAdmin(t *testing.T) {
  227. username := getRandomUsername()
  228. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  229. _, err := client.CreateUser(username, testStandardPassword, false)
  230. if err != nil {
  231. t.Fatal(err)
  232. }
  233. client = miniflux.NewClient(testBaseURL, username, testStandardPassword)
  234. _, err = client.CreateUser(username, testStandardPassword, false)
  235. if err == nil {
  236. t.Fatal(`Standard users should not be able to create users`)
  237. }
  238. }
  239. func TestCannotDeleteUserAsNonAdmin(t *testing.T) {
  240. username := getRandomUsername()
  241. client := miniflux.NewClient(testBaseURL, testAdminUsername, testAdminPassword)
  242. user, err := client.CreateUser(username, testStandardPassword, false)
  243. if err != nil {
  244. t.Fatal(err)
  245. }
  246. client = miniflux.NewClient(testBaseURL, username, testStandardPassword)
  247. if err := client.DeleteUser(user.ID); err == nil {
  248. t.Fatal(`Standard users should not be able to remove any users`)
  249. }
  250. }
  251. func getRandomUsername() string {
  252. rand.Seed(time.Now().UnixNano())
  253. var suffix []string
  254. for i := 0; i < 10; i++ {
  255. suffix = append(suffix, strconv.Itoa(rand.Intn(1000)))
  256. }
  257. return "user" + strings.Join(suffix, "")
  258. }