user_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. //go:build integration
  4. // +build integration
  5. package tests
  6. import (
  7. "testing"
  8. miniflux "miniflux.app/v2/client"
  9. )
  10. func TestWithWrongCredentials(t *testing.T) {
  11. client := miniflux.New(testBaseURL, "invalid", "invalid")
  12. _, err := client.Users()
  13. if err == nil {
  14. t.Fatal(`Using bad credentials should raise an error`)
  15. }
  16. if err != miniflux.ErrNotAuthorized {
  17. t.Fatal(`A "Not Authorized" error should be raised`)
  18. }
  19. }
  20. func TestGetCurrentLoggedUser(t *testing.T) {
  21. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  22. user, err := client.Me()
  23. if err != nil {
  24. t.Fatal(err)
  25. }
  26. if user.ID == 0 {
  27. t.Fatalf(`Invalid userID, got %q`, user.ID)
  28. }
  29. if user.Username != testAdminUsername {
  30. t.Fatalf(`Invalid username, got %q`, user.Username)
  31. }
  32. }
  33. func TestGetUsers(t *testing.T) {
  34. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  35. users, err := client.Users()
  36. if err != nil {
  37. t.Fatal(err)
  38. }
  39. if len(users) == 0 {
  40. t.Fatal("The list of users is empty")
  41. }
  42. if users[0].ID == 0 {
  43. t.Fatalf(`Invalid userID, got "%v"`, users[0].ID)
  44. }
  45. if users[0].Username != testAdminUsername {
  46. t.Fatalf(`Invalid username, got "%v" instead of "%v"`, users[0].Username, testAdminUsername)
  47. }
  48. if users[0].Password != "" {
  49. t.Fatalf(`Invalid password, got "%v"`, users[0].Password)
  50. }
  51. if users[0].Language != "en_US" {
  52. t.Fatalf(`Invalid language, got "%v"`, users[0].Language)
  53. }
  54. if users[0].Theme != "light_serif" {
  55. t.Fatalf(`Invalid theme, got "%v"`, users[0].Theme)
  56. }
  57. if users[0].Timezone != "UTC" {
  58. t.Fatalf(`Invalid timezone, got "%v"`, users[0].Timezone)
  59. }
  60. if !users[0].IsAdmin {
  61. t.Fatalf(`Invalid role, got "%v"`, users[0].IsAdmin)
  62. }
  63. if users[0].EntriesPerPage != 100 {
  64. t.Fatalf(`Invalid entries per page, got "%v"`, users[0].EntriesPerPage)
  65. }
  66. if users[0].DisplayMode != "standalone" {
  67. t.Fatalf(`Invalid web app display mode, got "%v"`, users[0].DisplayMode)
  68. }
  69. if users[0].GestureNav != "tap" {
  70. t.Fatalf(`Invalid gesture navigation, got "%v"`, users[0].GestureNav)
  71. }
  72. if users[0].DefaultReadingSpeed != 265 {
  73. t.Fatalf(`Invalid default reading speed, got "%v"`, users[0].DefaultReadingSpeed)
  74. }
  75. if users[0].CJKReadingSpeed != 500 {
  76. t.Fatalf(`Invalid cjk reading speed, got "%v"`, users[0].CJKReadingSpeed)
  77. }
  78. }
  79. func TestCreateStandardUser(t *testing.T) {
  80. username := getRandomUsername()
  81. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  82. user, err := client.CreateUser(username, testStandardPassword, false)
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. if user.ID == 0 {
  87. t.Fatalf(`Invalid userID, got "%v"`, user.ID)
  88. }
  89. if user.Username != username {
  90. t.Fatalf(`Invalid username, got "%v" instead of "%v"`, user.Username, username)
  91. }
  92. if user.Password != "" {
  93. t.Fatalf(`Invalid password, got "%v"`, user.Password)
  94. }
  95. if user.Language != "en_US" {
  96. t.Fatalf(`Invalid language, got "%v"`, user.Language)
  97. }
  98. if user.Theme != "light_serif" {
  99. t.Fatalf(`Invalid theme, got "%v"`, user.Theme)
  100. }
  101. if user.Timezone != "UTC" {
  102. t.Fatalf(`Invalid timezone, got "%v"`, user.Timezone)
  103. }
  104. if user.IsAdmin {
  105. t.Fatalf(`Invalid role, got "%v"`, user.IsAdmin)
  106. }
  107. if user.LastLoginAt != nil {
  108. t.Fatalf(`Invalid last login date, got "%v"`, user.LastLoginAt)
  109. }
  110. if user.EntriesPerPage != 100 {
  111. t.Fatalf(`Invalid entries per page, got "%v"`, user.EntriesPerPage)
  112. }
  113. if user.DisplayMode != "standalone" {
  114. t.Fatalf(`Invalid web app display mode, got "%v"`, user.DisplayMode)
  115. }
  116. if user.DefaultReadingSpeed != 265 {
  117. t.Fatalf(`Invalid default reading speed, got "%v"`, user.DefaultReadingSpeed)
  118. }
  119. if user.CJKReadingSpeed != 500 {
  120. t.Fatalf(`Invalid cjk reading speed, got "%v"`, user.CJKReadingSpeed)
  121. }
  122. }
  123. func TestRemoveUser(t *testing.T) {
  124. username := getRandomUsername()
  125. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  126. user, err := client.CreateUser(username, testStandardPassword, false)
  127. if err != nil {
  128. t.Fatal(err)
  129. }
  130. if err := client.DeleteUser(user.ID); err != nil {
  131. t.Fatalf(`Unable to remove user: "%v"`, err)
  132. }
  133. }
  134. func TestGetUserByID(t *testing.T) {
  135. username := getRandomUsername()
  136. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  137. user, err := client.CreateUser(username, testStandardPassword, false)
  138. if err != nil {
  139. t.Fatal(err)
  140. }
  141. _, err = client.UserByID(99999)
  142. if err == nil {
  143. t.Fatal(`Should returns a 404`)
  144. }
  145. user, err = client.UserByID(user.ID)
  146. if err != nil {
  147. t.Fatal(err)
  148. }
  149. if user.ID == 0 {
  150. t.Fatalf(`Invalid userID, got "%v"`, user.ID)
  151. }
  152. if user.Username != username {
  153. t.Fatalf(`Invalid username, got "%v" instead of "%v"`, user.Username, username)
  154. }
  155. if user.Password != "" {
  156. t.Fatalf(`Invalid password, got "%v"`, user.Password)
  157. }
  158. if user.Language != "en_US" {
  159. t.Fatalf(`Invalid language, got "%v"`, user.Language)
  160. }
  161. if user.Theme != "light_serif" {
  162. t.Fatalf(`Invalid theme, got "%v"`, user.Theme)
  163. }
  164. if user.Timezone != "UTC" {
  165. t.Fatalf(`Invalid timezone, got "%v"`, user.Timezone)
  166. }
  167. if user.IsAdmin {
  168. t.Fatalf(`Invalid role, got "%v"`, user.IsAdmin)
  169. }
  170. if user.LastLoginAt != nil {
  171. t.Fatalf(`Invalid last login date, got "%v"`, user.LastLoginAt)
  172. }
  173. if user.EntriesPerPage != 100 {
  174. t.Fatalf(`Invalid entries per page, got "%v"`, user.EntriesPerPage)
  175. }
  176. if user.DisplayMode != "standalone" {
  177. t.Fatalf(`Invalid web app display mode, got "%v"`, user.DisplayMode)
  178. }
  179. if user.DefaultReadingSpeed != 265 {
  180. t.Fatalf(`Invalid default reading speed, got "%v"`, user.DefaultReadingSpeed)
  181. }
  182. if user.CJKReadingSpeed != 500 {
  183. t.Fatalf(`Invalid cjk reading speed, got "%v"`, user.CJKReadingSpeed)
  184. }
  185. }
  186. func TestGetUserByUsername(t *testing.T) {
  187. username := getRandomUsername()
  188. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  189. _, err := client.CreateUser(username, testStandardPassword, false)
  190. if err != nil {
  191. t.Fatal(err)
  192. }
  193. _, err = client.UserByUsername("missinguser")
  194. if err == nil {
  195. t.Fatal(`Should returns a 404`)
  196. }
  197. user, err := client.UserByUsername(username)
  198. if err != nil {
  199. t.Fatal(err)
  200. }
  201. if user.ID == 0 {
  202. t.Fatalf(`Invalid userID, got "%v"`, user.ID)
  203. }
  204. if user.Username != username {
  205. t.Fatalf(`Invalid username, got "%v" instead of "%v"`, user.Username, username)
  206. }
  207. if user.Password != "" {
  208. t.Fatalf(`Invalid password, got "%v"`, user.Password)
  209. }
  210. if user.Language != "en_US" {
  211. t.Fatalf(`Invalid language, got "%v"`, user.Language)
  212. }
  213. if user.Theme != "light_serif" {
  214. t.Fatalf(`Invalid theme, got "%v"`, user.Theme)
  215. }
  216. if user.Timezone != "UTC" {
  217. t.Fatalf(`Invalid timezone, got "%v"`, user.Timezone)
  218. }
  219. if user.IsAdmin {
  220. t.Fatalf(`Invalid role, got "%v"`, user.IsAdmin)
  221. }
  222. if user.LastLoginAt != nil {
  223. t.Fatalf(`Invalid last login date, got "%v"`, user.LastLoginAt)
  224. }
  225. if user.EntriesPerPage != 100 {
  226. t.Fatalf(`Invalid entries per page, got "%v"`, user.EntriesPerPage)
  227. }
  228. if user.DisplayMode != "standalone" {
  229. t.Fatalf(`Invalid web app display mode, got "%v"`, user.DisplayMode)
  230. }
  231. if user.DefaultReadingSpeed != 265 {
  232. t.Fatalf(`Invalid default reading speed, got "%v"`, user.DefaultReadingSpeed)
  233. }
  234. if user.CJKReadingSpeed != 500 {
  235. t.Fatalf(`Invalid cjk reading speed, got "%v"`, user.CJKReadingSpeed)
  236. }
  237. }
  238. func TestUpdateUserTheme(t *testing.T) {
  239. username := getRandomUsername()
  240. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  241. user, err := client.CreateUser(username, testStandardPassword, false)
  242. if err != nil {
  243. t.Fatal(err)
  244. }
  245. theme := "dark_serif"
  246. user, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{Theme: &theme})
  247. if err != nil {
  248. t.Fatal(err)
  249. }
  250. if user.Theme != theme {
  251. t.Fatalf(`Unable to update user Theme: got "%v" instead of "%v"`, user.Theme, theme)
  252. }
  253. }
  254. func TestUpdateUserFields(t *testing.T) {
  255. username := getRandomUsername()
  256. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  257. user, err := client.CreateUser(username, testStandardPassword, false)
  258. if err != nil {
  259. t.Fatal(err)
  260. }
  261. stylesheet := "body { color: red }"
  262. swipe := false
  263. entriesPerPage := 5
  264. displayMode := "fullscreen"
  265. defaultReadingSpeed := 380
  266. cjkReadingSpeed := 200
  267. user, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{
  268. Stylesheet: &stylesheet,
  269. EntrySwipe: &swipe,
  270. EntriesPerPage: &entriesPerPage,
  271. DisplayMode: &displayMode,
  272. DefaultReadingSpeed: &defaultReadingSpeed,
  273. CJKReadingSpeed: &cjkReadingSpeed,
  274. })
  275. if err != nil {
  276. t.Fatal(err)
  277. }
  278. if user.Stylesheet != stylesheet {
  279. t.Fatalf(`Unable to update user stylesheet: got %q instead of %q`, user.Stylesheet, stylesheet)
  280. }
  281. if user.EntrySwipe != swipe {
  282. t.Fatalf(`Unable to update user EntrySwipe: got %v instead of %v`, user.EntrySwipe, swipe)
  283. }
  284. if user.EntriesPerPage != entriesPerPage {
  285. t.Fatalf(`Unable to update user EntriesPerPage: got %q instead of %q`, user.EntriesPerPage, entriesPerPage)
  286. }
  287. if user.DisplayMode != displayMode {
  288. t.Fatalf(`Unable to update user DisplayMode: got %q instead of %q`, user.DisplayMode, displayMode)
  289. }
  290. if user.DefaultReadingSpeed != defaultReadingSpeed {
  291. t.Fatalf(`Invalid default reading speed, got %v instead of %v`, user.DefaultReadingSpeed, defaultReadingSpeed)
  292. }
  293. if user.CJKReadingSpeed != cjkReadingSpeed {
  294. t.Fatalf(`Invalid cjk reading speed, got %v instead of %v`, user.CJKReadingSpeed, cjkReadingSpeed)
  295. }
  296. }
  297. func TestUpdateUserThemeWithInvalidValue(t *testing.T) {
  298. username := getRandomUsername()
  299. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  300. user, err := client.CreateUser(username, testStandardPassword, false)
  301. if err != nil {
  302. t.Fatal(err)
  303. }
  304. theme := "invalid"
  305. _, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{Theme: &theme})
  306. if err == nil {
  307. t.Fatal(`Updating a user Theme with an invalid value should raise an error`)
  308. }
  309. }
  310. func TestUpdateUserLanguageWithInvalidValue(t *testing.T) {
  311. username := getRandomUsername()
  312. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  313. user, err := client.CreateUser(username, testStandardPassword, false)
  314. if err != nil {
  315. t.Fatal(err)
  316. }
  317. language := "invalid"
  318. _, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{Language: &language})
  319. if err == nil {
  320. t.Fatal(`Updating a user language with an invalid value should raise an error`)
  321. }
  322. }
  323. func TestUpdateUserTimezoneWithInvalidValue(t *testing.T) {
  324. username := getRandomUsername()
  325. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  326. user, err := client.CreateUser(username, testStandardPassword, false)
  327. if err != nil {
  328. t.Fatal(err)
  329. }
  330. timezone := "invalid"
  331. _, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{Timezone: &timezone})
  332. if err == nil {
  333. t.Fatal(`Updating a user timezone with an invalid value should raise an error`)
  334. }
  335. }
  336. func TestUpdateUserEntriesPerPageWithInvalidValue(t *testing.T) {
  337. username := getRandomUsername()
  338. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  339. user, err := client.CreateUser(username, testStandardPassword, false)
  340. if err != nil {
  341. t.Fatal(err)
  342. }
  343. entriesPerPage := -5
  344. _, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{EntriesPerPage: &entriesPerPage})
  345. if err == nil {
  346. t.Fatal(`Updating a user EntriesPerPage with an invalid value should raise an error`)
  347. }
  348. }
  349. func TestUpdateUserEntryDirectionWithInvalidValue(t *testing.T) {
  350. username := getRandomUsername()
  351. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  352. user, err := client.CreateUser(username, testStandardPassword, false)
  353. if err != nil {
  354. t.Fatal(err)
  355. }
  356. entryDirection := "invalid"
  357. _, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{EntryDirection: &entryDirection})
  358. if err == nil {
  359. t.Fatal(`Updating a user EntryDirection with an invalid value should raise an error`)
  360. }
  361. }
  362. func TestUpdateUserEntryOrderWithInvalidValue(t *testing.T) {
  363. username := getRandomUsername()
  364. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  365. user, err := client.CreateUser(username, testStandardPassword, false)
  366. if err != nil {
  367. t.Fatal(err)
  368. }
  369. entryOrder := "invalid"
  370. _, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{EntryOrder: &entryOrder})
  371. if err == nil {
  372. t.Fatal(`Updating a user EntryOrder with an invalid value should raise an error`)
  373. }
  374. }
  375. func TestUpdateUserPasswordWithInvalidValue(t *testing.T) {
  376. username := getRandomUsername()
  377. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  378. user, err := client.CreateUser(username, testStandardPassword, false)
  379. if err != nil {
  380. t.Fatal(err)
  381. }
  382. password := "short"
  383. _, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{Password: &password})
  384. if err == nil {
  385. t.Fatal(`Updating a user password with an invalid value should raise an error`)
  386. }
  387. }
  388. func TestUpdateUserDisplayModeWithInvalidValue(t *testing.T) {
  389. username := getRandomUsername()
  390. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  391. user, err := client.CreateUser(username, testStandardPassword, false)
  392. if err != nil {
  393. t.Fatal(err)
  394. }
  395. displayMode := "invalid"
  396. _, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{DisplayMode: &displayMode})
  397. if err == nil {
  398. t.Fatal(`Updating a user web app display mode with an invalid value should raise an error`)
  399. }
  400. }
  401. func TestUpdateUserWithEmptyUsernameValue(t *testing.T) {
  402. username := getRandomUsername()
  403. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  404. user, err := client.CreateUser(username, testStandardPassword, false)
  405. if err != nil {
  406. t.Fatal(err)
  407. }
  408. newUsername := ""
  409. _, err = client.UpdateUser(user.ID, &miniflux.UserModificationRequest{Username: &newUsername})
  410. if err == nil {
  411. t.Fatal(`Updating a user with an empty username should raise an error`)
  412. }
  413. }
  414. func TestCannotCreateDuplicateUser(t *testing.T) {
  415. username := getRandomUsername()
  416. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  417. _, err := client.CreateUser(username, testStandardPassword, false)
  418. if err != nil {
  419. t.Fatal(err)
  420. }
  421. _, err = client.CreateUser(username, testStandardPassword, false)
  422. if err == nil {
  423. t.Fatal(`Duplicated users should not be allowed`)
  424. }
  425. }
  426. func TestCannotListUsersAsNonAdmin(t *testing.T) {
  427. username := getRandomUsername()
  428. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  429. _, err := client.CreateUser(username, testStandardPassword, false)
  430. if err != nil {
  431. t.Fatal(err)
  432. }
  433. client = miniflux.New(testBaseURL, username, testStandardPassword)
  434. _, err = client.Users()
  435. if err == nil {
  436. t.Fatal(`Standard users should not be able to list any users`)
  437. }
  438. if err != miniflux.ErrForbidden {
  439. t.Fatal(`A "Forbidden" error should be raised`)
  440. }
  441. }
  442. func TestCannotGetUserAsNonAdmin(t *testing.T) {
  443. username := getRandomUsername()
  444. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  445. user, err := client.CreateUser(username, testStandardPassword, false)
  446. if err != nil {
  447. t.Fatal(err)
  448. }
  449. client = miniflux.New(testBaseURL, username, testStandardPassword)
  450. _, err = client.UserByID(user.ID)
  451. if err == nil {
  452. t.Fatal(`Standard users should not be able to get any users`)
  453. }
  454. if err != miniflux.ErrForbidden {
  455. t.Fatal(`A "Forbidden" error should be raised`)
  456. }
  457. }
  458. func TestCannotUpdateUserAsNonAdmin(t *testing.T) {
  459. adminClient := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  460. usernameA := getRandomUsername()
  461. userA, err := adminClient.CreateUser(usernameA, testStandardPassword, false)
  462. if err != nil {
  463. t.Fatal(err)
  464. }
  465. usernameB := getRandomUsername()
  466. _, err = adminClient.CreateUser(usernameB, testStandardPassword, false)
  467. if err != nil {
  468. t.Fatal(err)
  469. }
  470. entriesPerPage := 10
  471. userAClient := miniflux.New(testBaseURL, usernameA, testStandardPassword)
  472. userAAfterUpdate, err := userAClient.UpdateUser(userA.ID, &miniflux.UserModificationRequest{EntriesPerPage: &entriesPerPage})
  473. if err != nil {
  474. t.Fatal(`Standard users should be able to update themselves`)
  475. }
  476. if userAAfterUpdate.EntriesPerPage != entriesPerPage {
  477. t.Fatalf(`The EntriesPerPage field of this user should be updated`)
  478. }
  479. isAdmin := true
  480. _, err = userAClient.UpdateUser(userA.ID, &miniflux.UserModificationRequest{IsAdmin: &isAdmin})
  481. if err == nil {
  482. t.Fatal(`Standard users should not be able to become admin`)
  483. }
  484. userBClient := miniflux.New(testBaseURL, usernameB, testStandardPassword)
  485. _, err = userBClient.UpdateUser(userA.ID, &miniflux.UserModificationRequest{})
  486. if err == nil {
  487. t.Fatal(`Standard users should not be able to update other users`)
  488. }
  489. if err != miniflux.ErrForbidden {
  490. t.Fatal(`A "Forbidden" error should be raised`)
  491. }
  492. stylesheet := "test"
  493. userC, err := adminClient.UpdateUser(userA.ID, &miniflux.UserModificationRequest{Stylesheet: &stylesheet})
  494. if err != nil {
  495. t.Fatal(`Admin users should be able to update any users`)
  496. }
  497. if userC.Stylesheet != stylesheet {
  498. t.Fatalf(`The Stylesheet field of this user should be updated`)
  499. }
  500. }
  501. func TestCannotCreateUserAsNonAdmin(t *testing.T) {
  502. username := getRandomUsername()
  503. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  504. _, err := client.CreateUser(username, testStandardPassword, false)
  505. if err != nil {
  506. t.Fatal(err)
  507. }
  508. client = miniflux.New(testBaseURL, username, testStandardPassword)
  509. _, err = client.CreateUser(username, testStandardPassword, false)
  510. if err == nil {
  511. t.Fatal(`Standard users should not be able to create users`)
  512. }
  513. if err != miniflux.ErrForbidden {
  514. t.Fatal(`A "Forbidden" error should be raised`)
  515. }
  516. }
  517. func TestCannotDeleteUserAsNonAdmin(t *testing.T) {
  518. username := getRandomUsername()
  519. client := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  520. user, err := client.CreateUser(username, testStandardPassword, false)
  521. if err != nil {
  522. t.Fatal(err)
  523. }
  524. client = miniflux.New(testBaseURL, username, testStandardPassword)
  525. err = client.DeleteUser(user.ID)
  526. if err == nil {
  527. t.Fatal(`Standard users should not be able to remove any users`)
  528. }
  529. if err != miniflux.ErrForbidden {
  530. t.Fatal(`A "Forbidden" error should be raised`)
  531. }
  532. }
  533. func TestMarkUserAsReadAsUser(t *testing.T) {
  534. username := getRandomUsername()
  535. adminClient := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  536. user, err := adminClient.CreateUser(username, testStandardPassword, false)
  537. if err != nil {
  538. t.Fatal(err)
  539. }
  540. client := miniflux.New(testBaseURL, username, testStandardPassword)
  541. feed, _ := createFeed(t, client)
  542. results, err := client.FeedEntries(feed.ID, nil)
  543. if err != nil {
  544. t.Fatalf(`Failed to get entries: %v`, err)
  545. }
  546. if results.Total == 0 {
  547. t.Fatalf(`Invalid number of entries: %d`, results.Total)
  548. }
  549. if results.Entries[0].Status != miniflux.EntryStatusUnread {
  550. t.Fatalf(`Invalid entry status, got %q instead of %q`, results.Entries[0].Status, miniflux.EntryStatusUnread)
  551. }
  552. if err := client.MarkAllAsRead(user.ID); err != nil {
  553. t.Fatalf(`Failed to mark user's unread entries as read: %v`, err)
  554. }
  555. results, err = client.FeedEntries(feed.ID, nil)
  556. if err != nil {
  557. t.Fatalf(`Failed to get updated entries: %v`, err)
  558. }
  559. for _, entry := range results.Entries {
  560. if entry.Status != miniflux.EntryStatusRead {
  561. t.Errorf(`Status for entry %d was %q instead of %q`, entry.ID, entry.Status, miniflux.EntryStatusRead)
  562. }
  563. }
  564. }
  565. func TestCannotMarkUserAsReadAsOtherUser(t *testing.T) {
  566. username := getRandomUsername()
  567. adminClient := miniflux.New(testBaseURL, testAdminUsername, testAdminPassword)
  568. user1, err := adminClient.CreateUser(username, testStandardPassword, false)
  569. if err != nil {
  570. t.Fatal(err)
  571. }
  572. createFeed(t, miniflux.New(testBaseURL, username, testStandardPassword))
  573. username2 := getRandomUsername()
  574. if _, err = adminClient.CreateUser(username2, testStandardPassword, false); err != nil {
  575. t.Fatal(err)
  576. }
  577. client := miniflux.New(testBaseURL, username2, testStandardPassword)
  578. err = client.MarkAllAsRead(user1.ID)
  579. if err == nil {
  580. t.Fatalf(`Non-admin users should not be able to mark another user as read`)
  581. }
  582. if err != miniflux.ErrForbidden {
  583. t.Errorf(`A "Forbidden" error should be raised, got %q`, err)
  584. }
  585. }