entry_test.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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 TestSearchEntries(t *testing.T) {
  101. client := createClient(t)
  102. categories, err := client.Categories()
  103. if err != nil {
  104. t.Fatal(err)
  105. }
  106. feedID, err := client.CreateFeed(testFeedURL, categories[0].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{Search: "2.0.8"})
  114. if err != nil {
  115. t.Fatal(err)
  116. }
  117. if results.Total != 1 {
  118. t.Fatalf(`We should have only one entry instead of %d`, results.Total)
  119. }
  120. }
  121. func TestInvalidFilters(t *testing.T) {
  122. client := createClient(t)
  123. createFeed(t, client)
  124. _, err := client.Entries(&miniflux.Filter{Status: "invalid"})
  125. if err == nil {
  126. t.Fatal(`Using invalid status should raise an error`)
  127. }
  128. _, err = client.Entries(&miniflux.Filter{Direction: "invalid"})
  129. if err == nil {
  130. t.Fatal(`Using invalid direction should raise an error`)
  131. }
  132. _, err = client.Entries(&miniflux.Filter{Order: "invalid"})
  133. if err == nil {
  134. t.Fatal(`Using invalid order should raise an error`)
  135. }
  136. }
  137. func TestGetEntry(t *testing.T) {
  138. client := createClient(t)
  139. createFeed(t, client)
  140. result, err := client.Entries(&miniflux.Filter{Limit: 1})
  141. if err != nil {
  142. t.Fatal(err)
  143. }
  144. entry, err := client.FeedEntry(result.Entries[0].FeedID, result.Entries[0].ID)
  145. if err != nil {
  146. t.Fatal(err)
  147. }
  148. if entry.ID != result.Entries[0].ID {
  149. t.Fatal("Wrong entry returned")
  150. }
  151. entry, err = client.Entry(result.Entries[0].ID)
  152. if err != nil {
  153. t.Fatal(err)
  154. }
  155. if entry.ID != result.Entries[0].ID {
  156. t.Fatal("Wrong entry returned")
  157. }
  158. }
  159. func TestUpdateStatus(t *testing.T) {
  160. client := createClient(t)
  161. createFeed(t, client)
  162. result, err := client.Entries(&miniflux.Filter{Limit: 1})
  163. if err != nil {
  164. t.Fatal(err)
  165. }
  166. err = client.UpdateEntries([]int64{result.Entries[0].ID}, miniflux.EntryStatusRead)
  167. if err != nil {
  168. t.Fatal(err)
  169. }
  170. entry, err := client.Entry(result.Entries[0].ID)
  171. if err != nil {
  172. t.Fatal(err)
  173. }
  174. if entry.Status != miniflux.EntryStatusRead {
  175. t.Fatal("The entry status should be updated")
  176. }
  177. err = client.UpdateEntries([]int64{result.Entries[0].ID}, "invalid")
  178. if err == nil {
  179. t.Fatal(`Invalid entry status should ne be accepted`)
  180. }
  181. }
  182. func TestToggleBookmark(t *testing.T) {
  183. client := createClient(t)
  184. createFeed(t, client)
  185. result, err := client.Entries(&miniflux.Filter{Limit: 1})
  186. if err != nil {
  187. t.Fatal(err)
  188. }
  189. if result.Entries[0].Starred {
  190. t.Fatal("The entry should not be starred")
  191. }
  192. err = client.ToggleBookmark(result.Entries[0].ID)
  193. if err != nil {
  194. t.Fatal(err)
  195. }
  196. entry, err := client.Entry(result.Entries[0].ID)
  197. if err != nil {
  198. t.Fatal(err)
  199. }
  200. if !entry.Starred {
  201. t.Fatal("The entry should be starred")
  202. }
  203. }
  204. func TestHistoryOrder(t *testing.T) {
  205. client := createClient(t)
  206. createFeed(t, client)
  207. result, err := client.Entries(&miniflux.Filter{Limit: 3})
  208. if err != nil {
  209. t.Fatal(err)
  210. }
  211. selectedEntry := result.Entries[2].ID
  212. err = client.UpdateEntries([]int64{selectedEntry}, miniflux.EntryStatusRead)
  213. if err != nil {
  214. t.Fatal(err)
  215. }
  216. history, err := client.Entries(&miniflux.Filter{Order: "changed_at", Direction: "desc", Limit: 1})
  217. if err != nil {
  218. t.Fatal(err)
  219. }
  220. if history.Entries[0].ID != selectedEntry {
  221. t.Fatal("The entry that we just read should be at the top of the history")
  222. }
  223. }