entry_test.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  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(&miniflux.FeedCreationRequest{
  80. FeedURL: testFeedURL,
  81. CategoryID: category.ID,
  82. })
  83. if err != nil {
  84. t.Fatal(err)
  85. }
  86. if feedID == 0 {
  87. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  88. }
  89. results, err := client.Entries(&miniflux.Filter{CategoryID: category.ID})
  90. if err != nil {
  91. t.Fatal(err)
  92. }
  93. if results.Total == 0 {
  94. t.Fatalf(`We should have more than one entry`)
  95. }
  96. if results.Entries[0].Feed.Category == nil {
  97. t.Fatalf(`The entry feed category should not be nil`)
  98. }
  99. if results.Entries[0].Feed.Category.ID != category.ID {
  100. t.Errorf(`Entries should be filtered by category_id=%d`, category.ID)
  101. }
  102. }
  103. func TestFilterEntriesByStatuses(t *testing.T) {
  104. client := createClient(t)
  105. category, err := client.CreateCategory("Test Filter by statuses")
  106. if err != nil {
  107. t.Fatal(err)
  108. }
  109. feedID, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  110. FeedURL: testFeedURL,
  111. CategoryID: category.ID,
  112. })
  113. if err != nil {
  114. t.Fatal(err)
  115. }
  116. if feedID == 0 {
  117. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  118. }
  119. results, err := client.Entries(&miniflux.Filter{FeedID: feedID})
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. if err := client.UpdateEntries([]int64{results.Entries[0].ID}, "read"); err != nil {
  124. t.Fatal(err)
  125. }
  126. if err := client.UpdateEntries([]int64{results.Entries[1].ID}, "removed"); err != nil {
  127. t.Fatal(err)
  128. }
  129. results, err = client.Entries(&miniflux.Filter{Statuses: []string{"read", "removed"}})
  130. if err != nil {
  131. t.Fatal(err)
  132. }
  133. if results.Total != 2 {
  134. t.Fatalf(`We should have 2 entries`)
  135. }
  136. if results.Entries[0].Status != "read" {
  137. t.Errorf(`The first entry has the wrong status: %s`, results.Entries[0].Status)
  138. }
  139. if results.Entries[1].Status != "removed" {
  140. t.Errorf(`The 2nd entry has the wrong status: %s`, results.Entries[1].Status)
  141. }
  142. }
  143. func TestSearchEntries(t *testing.T) {
  144. client := createClient(t)
  145. categories, err := client.Categories()
  146. if err != nil {
  147. t.Fatal(err)
  148. }
  149. feedID, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  150. FeedURL: testFeedURL,
  151. CategoryID: categories[0].ID,
  152. })
  153. if err != nil {
  154. t.Fatal(err)
  155. }
  156. if feedID == 0 {
  157. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  158. }
  159. results, err := client.Entries(&miniflux.Filter{Search: "2.0.8"})
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. if results.Total != 1 {
  164. t.Fatalf(`We should have only one entry instead of %d`, results.Total)
  165. }
  166. }
  167. func TestInvalidFilters(t *testing.T) {
  168. client := createClient(t)
  169. createFeed(t, client)
  170. _, err := client.Entries(&miniflux.Filter{Status: "invalid"})
  171. if err == nil {
  172. t.Fatal(`Using invalid status should raise an error`)
  173. }
  174. _, err = client.Entries(&miniflux.Filter{Direction: "invalid"})
  175. if err == nil {
  176. t.Fatal(`Using invalid direction should raise an error`)
  177. }
  178. _, err = client.Entries(&miniflux.Filter{Order: "invalid"})
  179. if err == nil {
  180. t.Fatal(`Using invalid order should raise an error`)
  181. }
  182. }
  183. func TestGetEntry(t *testing.T) {
  184. client := createClient(t)
  185. createFeed(t, client)
  186. result, err := client.Entries(&miniflux.Filter{Limit: 1})
  187. if err != nil {
  188. t.Fatal(err)
  189. }
  190. entry, err := client.FeedEntry(result.Entries[0].FeedID, result.Entries[0].ID)
  191. if err != nil {
  192. t.Fatal(err)
  193. }
  194. if entry.ID != result.Entries[0].ID {
  195. t.Fatal("Wrong entry returned")
  196. }
  197. entry, err = client.Entry(result.Entries[0].ID)
  198. if err != nil {
  199. t.Fatal(err)
  200. }
  201. if entry.ID != result.Entries[0].ID {
  202. t.Fatal("Wrong entry returned")
  203. }
  204. }
  205. func TestUpdateStatus(t *testing.T) {
  206. client := createClient(t)
  207. createFeed(t, client)
  208. result, err := client.Entries(&miniflux.Filter{Limit: 1})
  209. if err != nil {
  210. t.Fatal(err)
  211. }
  212. err = client.UpdateEntries([]int64{result.Entries[0].ID}, miniflux.EntryStatusRead)
  213. if err != nil {
  214. t.Fatal(err)
  215. }
  216. entry, err := client.Entry(result.Entries[0].ID)
  217. if err != nil {
  218. t.Fatal(err)
  219. }
  220. if entry.Status != miniflux.EntryStatusRead {
  221. t.Fatal("The entry status should be updated")
  222. }
  223. err = client.UpdateEntries([]int64{result.Entries[0].ID}, "invalid")
  224. if err == nil {
  225. t.Fatal(`Invalid entry status should ne be accepted`)
  226. }
  227. }
  228. func TestToggleBookmark(t *testing.T) {
  229. client := createClient(t)
  230. createFeed(t, client)
  231. result, err := client.Entries(&miniflux.Filter{Limit: 1})
  232. if err != nil {
  233. t.Fatal(err)
  234. }
  235. if result.Entries[0].Starred {
  236. t.Fatal("The entry should not be starred")
  237. }
  238. err = client.ToggleBookmark(result.Entries[0].ID)
  239. if err != nil {
  240. t.Fatal(err)
  241. }
  242. entry, err := client.Entry(result.Entries[0].ID)
  243. if err != nil {
  244. t.Fatal(err)
  245. }
  246. if !entry.Starred {
  247. t.Fatal("The entry should be starred")
  248. }
  249. }
  250. func TestHistoryOrder(t *testing.T) {
  251. client := createClient(t)
  252. createFeed(t, client)
  253. result, err := client.Entries(&miniflux.Filter{Limit: 3})
  254. if err != nil {
  255. t.Fatal(err)
  256. }
  257. selectedEntry := result.Entries[2].ID
  258. err = client.UpdateEntries([]int64{selectedEntry}, miniflux.EntryStatusRead)
  259. if err != nil {
  260. t.Fatal(err)
  261. }
  262. history, err := client.Entries(&miniflux.Filter{Order: "changed_at", Direction: "desc", Limit: 1})
  263. if err != nil {
  264. t.Fatal(err)
  265. }
  266. if history.Entries[0].ID != selectedEntry {
  267. t.Fatal("The entry that we just read should be at the top of the history")
  268. }
  269. }