entry_test.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. // Copyright 2018 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 tests
  6. import (
  7. "testing"
  8. miniflux "miniflux.app/client"
  9. )
  10. func TestGetAllFeedEntries(t *testing.T) {
  11. client := createClient(t)
  12. feed, _ := createFeed(t, client)
  13. allResults, err := client.FeedEntries(feed.ID, nil)
  14. if err != nil {
  15. t.Fatal(err)
  16. }
  17. if allResults.Total == 0 {
  18. t.Fatal(`Invalid number of entries`)
  19. }
  20. if allResults.Entries[0].Title == "" {
  21. t.Fatal(`Invalid entry title`)
  22. }
  23. filteredResults, err := client.FeedEntries(feed.ID, &miniflux.Filter{Limit: 1, Offset: 5})
  24. if err != nil {
  25. t.Fatal(err)
  26. }
  27. if allResults.Total != filteredResults.Total {
  28. t.Fatal(`Total should always contains the total number of items regardless of filters`)
  29. }
  30. if allResults.Entries[0].ID == filteredResults.Entries[0].ID {
  31. t.Fatal(`Filtered entries should be different than previous results`)
  32. }
  33. filteredResultsByEntryID, err := client.FeedEntries(feed.ID, &miniflux.Filter{BeforeEntryID: allResults.Entries[0].ID})
  34. if err != nil {
  35. t.Fatal(err)
  36. }
  37. if filteredResultsByEntryID.Entries[0].ID == allResults.Entries[0].ID {
  38. t.Fatal(`The first entry should filtered out`)
  39. }
  40. }
  41. func TestGetAllEntries(t *testing.T) {
  42. client := createClient(t)
  43. createFeed(t, client)
  44. resultWithoutSorting, err := client.Entries(nil)
  45. if err != nil {
  46. t.Fatal(err)
  47. }
  48. if resultWithoutSorting.Total == 0 {
  49. t.Fatal(`Invalid number of entries`)
  50. }
  51. resultWithStatusFilter, err := client.Entries(&miniflux.Filter{Status: miniflux.EntryStatusRead})
  52. if err != nil {
  53. t.Fatal(err)
  54. }
  55. if resultWithStatusFilter.Total != 0 {
  56. t.Fatal(`We should have 0 read entries`)
  57. }
  58. resultWithDifferentSorting, err := client.Entries(&miniflux.Filter{Order: "published_at", Direction: "desc"})
  59. if err != nil {
  60. t.Fatal(err)
  61. }
  62. if resultWithDifferentSorting.Entries[0].Title == resultWithoutSorting.Entries[0].Title {
  63. t.Fatalf(`The items should be sorted differently "%v" vs "%v"`, resultWithDifferentSorting.Entries[0].Title, resultWithoutSorting.Entries[0].Title)
  64. }
  65. resultWithStarredEntries, err := client.Entries(&miniflux.Filter{Starred: true})
  66. if err != nil {
  67. t.Fatal(err)
  68. }
  69. if resultWithStarredEntries.Total != 0 {
  70. t.Fatalf(`We are not supposed to have starred entries yet`)
  71. }
  72. }
  73. func TestFilterEntriesByCategory(t *testing.T) {
  74. client := createClient(t)
  75. category, err := client.CreateCategory("Test Filter by Category")
  76. if err != nil {
  77. t.Fatal(err)
  78. }
  79. feedID, err := client.CreateFeed(testFeedURL, category.ID)
  80. if err != nil {
  81. t.Fatal(err)
  82. }
  83. if feedID == 0 {
  84. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  85. }
  86. results, err := client.Entries(&miniflux.Filter{CategoryID: category.ID})
  87. if err != nil {
  88. t.Fatal(err)
  89. }
  90. if results.Total == 0 {
  91. t.Fatalf(`We should have more than one entry`)
  92. }
  93. if results.Entries[0].Feed.Category == nil {
  94. t.Fatalf(`The entry feed category should not be nil`)
  95. }
  96. if results.Entries[0].Feed.Category.ID != category.ID {
  97. t.Errorf(`Entries should be filtered by category_id=%d`, category.ID)
  98. }
  99. }
  100. func TestFilterEntriesByStatuses(t *testing.T) {
  101. client := createClient(t)
  102. category, err := client.CreateCategory("Test Filter by statuses")
  103. if err != nil {
  104. t.Fatal(err)
  105. }
  106. feedID, err := client.CreateFeed(testFeedURL, category.ID)
  107. if err != nil {
  108. t.Fatal(err)
  109. }
  110. if feedID == 0 {
  111. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  112. }
  113. results, err := client.Entries(&miniflux.Filter{FeedID: feedID})
  114. if err != nil {
  115. t.Fatal(err)
  116. }
  117. if err := client.UpdateEntries([]int64{results.Entries[0].ID}, "read"); err != nil {
  118. t.Fatal(err)
  119. }
  120. if err := client.UpdateEntries([]int64{results.Entries[1].ID}, "removed"); err != nil {
  121. t.Fatal(err)
  122. }
  123. results, err = client.Entries(&miniflux.Filter{Statuses: []string{"read", "removed"}})
  124. if err != nil {
  125. t.Fatal(err)
  126. }
  127. if results.Total != 2 {
  128. t.Fatalf(`We should have 2 entries`)
  129. }
  130. if results.Entries[0].Status != "read" {
  131. t.Errorf(`The first entry has the wrong status: %s`, results.Entries[0].Status)
  132. }
  133. if results.Entries[1].Status != "removed" {
  134. t.Errorf(`The 2nd entry has the wrong status: %s`, results.Entries[1].Status)
  135. }
  136. }
  137. func TestSearchEntries(t *testing.T) {
  138. client := createClient(t)
  139. categories, err := client.Categories()
  140. if err != nil {
  141. t.Fatal(err)
  142. }
  143. feedID, err := client.CreateFeed(testFeedURL, categories[0].ID)
  144. if err != nil {
  145. t.Fatal(err)
  146. }
  147. if feedID == 0 {
  148. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  149. }
  150. results, err := client.Entries(&miniflux.Filter{Search: "2.0.8"})
  151. if err != nil {
  152. t.Fatal(err)
  153. }
  154. if results.Total != 1 {
  155. t.Fatalf(`We should have only one entry instead of %d`, results.Total)
  156. }
  157. }
  158. func TestInvalidFilters(t *testing.T) {
  159. client := createClient(t)
  160. createFeed(t, client)
  161. _, err := client.Entries(&miniflux.Filter{Status: "invalid"})
  162. if err == nil {
  163. t.Fatal(`Using invalid status should raise an error`)
  164. }
  165. _, err = client.Entries(&miniflux.Filter{Direction: "invalid"})
  166. if err == nil {
  167. t.Fatal(`Using invalid direction should raise an error`)
  168. }
  169. _, err = client.Entries(&miniflux.Filter{Order: "invalid"})
  170. if err == nil {
  171. t.Fatal(`Using invalid order should raise an error`)
  172. }
  173. }
  174. func TestGetEntry(t *testing.T) {
  175. client := createClient(t)
  176. createFeed(t, client)
  177. result, err := client.Entries(&miniflux.Filter{Limit: 1})
  178. if err != nil {
  179. t.Fatal(err)
  180. }
  181. entry, err := client.FeedEntry(result.Entries[0].FeedID, result.Entries[0].ID)
  182. if err != nil {
  183. t.Fatal(err)
  184. }
  185. if entry.ID != result.Entries[0].ID {
  186. t.Fatal("Wrong entry returned")
  187. }
  188. entry, err = client.Entry(result.Entries[0].ID)
  189. if err != nil {
  190. t.Fatal(err)
  191. }
  192. if entry.ID != result.Entries[0].ID {
  193. t.Fatal("Wrong entry returned")
  194. }
  195. }
  196. func TestUpdateStatus(t *testing.T) {
  197. client := createClient(t)
  198. createFeed(t, client)
  199. result, err := client.Entries(&miniflux.Filter{Limit: 1})
  200. if err != nil {
  201. t.Fatal(err)
  202. }
  203. err = client.UpdateEntries([]int64{result.Entries[0].ID}, miniflux.EntryStatusRead)
  204. if err != nil {
  205. t.Fatal(err)
  206. }
  207. entry, err := client.Entry(result.Entries[0].ID)
  208. if err != nil {
  209. t.Fatal(err)
  210. }
  211. if entry.Status != miniflux.EntryStatusRead {
  212. t.Fatal("The entry status should be updated")
  213. }
  214. err = client.UpdateEntries([]int64{result.Entries[0].ID}, "invalid")
  215. if err == nil {
  216. t.Fatal(`Invalid entry status should ne be accepted`)
  217. }
  218. }
  219. func TestToggleBookmark(t *testing.T) {
  220. client := createClient(t)
  221. createFeed(t, client)
  222. result, err := client.Entries(&miniflux.Filter{Limit: 1})
  223. if err != nil {
  224. t.Fatal(err)
  225. }
  226. if result.Entries[0].Starred {
  227. t.Fatal("The entry should not be starred")
  228. }
  229. err = client.ToggleBookmark(result.Entries[0].ID)
  230. if err != nil {
  231. t.Fatal(err)
  232. }
  233. entry, err := client.Entry(result.Entries[0].ID)
  234. if err != nil {
  235. t.Fatal(err)
  236. }
  237. if !entry.Starred {
  238. t.Fatal("The entry should be starred")
  239. }
  240. }
  241. func TestHistoryOrder(t *testing.T) {
  242. client := createClient(t)
  243. createFeed(t, client)
  244. result, err := client.Entries(&miniflux.Filter{Limit: 3})
  245. if err != nil {
  246. t.Fatal(err)
  247. }
  248. selectedEntry := result.Entries[2].ID
  249. err = client.UpdateEntries([]int64{selectedEntry}, miniflux.EntryStatusRead)
  250. if err != nil {
  251. t.Fatal(err)
  252. }
  253. history, err := client.Entries(&miniflux.Filter{Order: "changed_at", Direction: "desc", Limit: 1})
  254. if err != nil {
  255. t.Fatal(err)
  256. }
  257. if history.Entries[0].ID != selectedEntry {
  258. t.Fatal("The entry that we just read should be at the top of the history")
  259. }
  260. }