feed_test.go 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  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. "strings"
  8. "testing"
  9. miniflux "miniflux.app/v2/client"
  10. )
  11. func TestCreateFeed(t *testing.T) {
  12. client := createClient(t)
  13. feed, _ := createFeed(t, client)
  14. if feed.ID == 0 {
  15. t.Fatalf(`Invalid feed ID, got %q`, feed.ID)
  16. }
  17. }
  18. func TestCannotCreateDuplicatedFeed(t *testing.T) {
  19. client := createClient(t)
  20. feed, category := createFeed(t, client)
  21. _, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  22. FeedURL: feed.FeedURL,
  23. CategoryID: category.ID,
  24. })
  25. if err == nil {
  26. t.Fatal(`Duplicated feeds should not be allowed`)
  27. }
  28. }
  29. func TestCreateFeedWithInexistingCategory(t *testing.T) {
  30. client := createClient(t)
  31. _, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  32. FeedURL: testFeedURL,
  33. CategoryID: -1,
  34. })
  35. if err == nil {
  36. t.Fatal(`Feeds should not be created with inexisting category`)
  37. }
  38. }
  39. func TestCreateFeedWithEmptyFeedURL(t *testing.T) {
  40. client := createClient(t)
  41. categories, err := client.Categories()
  42. if err != nil {
  43. t.Fatal(err)
  44. }
  45. _, err = client.CreateFeed(&miniflux.FeedCreationRequest{
  46. FeedURL: "",
  47. CategoryID: categories[0].ID,
  48. })
  49. if err == nil {
  50. t.Fatal(`Feeds should not be created with an empty feed URL`)
  51. }
  52. }
  53. func TestCreateFeedWithInvalidFeedURL(t *testing.T) {
  54. client := createClient(t)
  55. categories, err := client.Categories()
  56. if err != nil {
  57. t.Fatal(err)
  58. }
  59. _, err = client.CreateFeed(&miniflux.FeedCreationRequest{
  60. FeedURL: "invalid",
  61. CategoryID: categories[0].ID,
  62. })
  63. if err == nil {
  64. t.Fatal(`Feeds should not be created with an invalid feed URL`)
  65. }
  66. }
  67. func TestCreateDisabledFeed(t *testing.T) {
  68. client := createClient(t)
  69. categories, err := client.Categories()
  70. if err != nil {
  71. t.Fatal(err)
  72. }
  73. feedID, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  74. FeedURL: testFeedURL,
  75. CategoryID: categories[0].ID,
  76. Disabled: true,
  77. })
  78. if err != nil {
  79. t.Fatal(err)
  80. }
  81. if feedID == 0 {
  82. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  83. }
  84. feed, err := client.Feed(feedID)
  85. if err != nil {
  86. t.Fatal(err)
  87. }
  88. if !feed.Disabled {
  89. t.Error(`The feed should be disabled`)
  90. }
  91. }
  92. func TestCreateFeedWithDisabledCache(t *testing.T) {
  93. client := createClient(t)
  94. categories, err := client.Categories()
  95. if err != nil {
  96. t.Fatal(err)
  97. }
  98. feedID, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  99. FeedURL: testFeedURL,
  100. CategoryID: categories[0].ID,
  101. IgnoreHTTPCache: true,
  102. })
  103. if err != nil {
  104. t.Fatal(err)
  105. }
  106. if feedID == 0 {
  107. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  108. }
  109. feed, err := client.Feed(feedID)
  110. if err != nil {
  111. t.Fatal(err)
  112. }
  113. if !feed.IgnoreHTTPCache {
  114. t.Error(`The feed should be ignoring HTTP cache`)
  115. }
  116. }
  117. func TestCreateFeedWithCrawlerEnabled(t *testing.T) {
  118. client := createClient(t)
  119. categories, err := client.Categories()
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. feedID, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  124. FeedURL: testFeedURL,
  125. CategoryID: categories[0].ID,
  126. Crawler: true,
  127. })
  128. if err != nil {
  129. t.Fatal(err)
  130. }
  131. if feedID == 0 {
  132. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  133. }
  134. feed, err := client.Feed(feedID)
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. if !feed.Crawler {
  139. t.Error(`The feed should have the scraper enabled`)
  140. }
  141. }
  142. func TestCreateFeedWithSelfSignedCertificatesAllowed(t *testing.T) {
  143. client := createClient(t)
  144. categories, err := client.Categories()
  145. if err != nil {
  146. t.Fatal(err)
  147. }
  148. feedID, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  149. FeedURL: testFeedURL,
  150. CategoryID: categories[0].ID,
  151. AllowSelfSignedCertificates: true,
  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. feed, err := client.Feed(feedID)
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. if !feed.AllowSelfSignedCertificates {
  164. t.Error(`The feed should have self-signed certificates enabled`)
  165. }
  166. }
  167. func TestCreateFeedWithScraperRule(t *testing.T) {
  168. client := createClient(t)
  169. categories, err := client.Categories()
  170. if err != nil {
  171. t.Fatal(err)
  172. }
  173. feedID, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  174. FeedURL: testFeedURL,
  175. CategoryID: categories[0].ID,
  176. ScraperRules: "article",
  177. })
  178. if err != nil {
  179. t.Fatal(err)
  180. }
  181. if feedID == 0 {
  182. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  183. }
  184. feed, err := client.Feed(feedID)
  185. if err != nil {
  186. t.Fatal(err)
  187. }
  188. if feed.ScraperRules != "article" {
  189. t.Error(`The feed should have the custom scraper rule saved`)
  190. }
  191. }
  192. func TestCreateFeedWithKeeplistRule(t *testing.T) {
  193. client := createClient(t)
  194. categories, err := client.Categories()
  195. if err != nil {
  196. t.Fatal(err)
  197. }
  198. feedID, err := client.CreateFeed(&miniflux.FeedCreationRequest{
  199. FeedURL: testFeedURL,
  200. CategoryID: categories[0].ID,
  201. KeeplistRules: "(?i)miniflux",
  202. })
  203. if err != nil {
  204. t.Fatal(err)
  205. }
  206. if feedID == 0 {
  207. t.Fatalf(`Invalid feed ID, got %q`, feedID)
  208. }
  209. feed, err := client.Feed(feedID)
  210. if err != nil {
  211. t.Fatal(err)
  212. }
  213. if feed.KeeplistRules != "(?i)miniflux" {
  214. t.Error(`The feed should have the custom keep list rule saved`)
  215. }
  216. }
  217. func TestCreateFeedWithInvalidBlocklistRule(t *testing.T) {
  218. client := createClient(t)
  219. categories, err := client.Categories()
  220. if err != nil {
  221. t.Fatal(err)
  222. }
  223. _, err = client.CreateFeed(&miniflux.FeedCreationRequest{
  224. FeedURL: testFeedURL,
  225. CategoryID: categories[0].ID,
  226. BlocklistRules: "[",
  227. })
  228. if err == nil {
  229. t.Fatal(`Feed with invalid block list rule should not be created`)
  230. }
  231. }
  232. func TestUpdateFeedURL(t *testing.T) {
  233. client := createClient(t)
  234. feed, _ := createFeed(t, client)
  235. url := "https://www.example.org/feed.xml"
  236. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{FeedURL: &url})
  237. if err != nil {
  238. t.Fatal(err)
  239. }
  240. if updatedFeed.FeedURL != url {
  241. t.Fatalf(`Wrong FeedURL, got %q instead of %q`, updatedFeed.FeedURL, url)
  242. }
  243. }
  244. func TestUpdateFeedWithEmptyFeedURL(t *testing.T) {
  245. client := createClient(t)
  246. feed, _ := createFeed(t, client)
  247. url := ""
  248. if _, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{FeedURL: &url}); err == nil {
  249. t.Error(`Updating a feed with an empty feed URL should not be possible`)
  250. }
  251. }
  252. func TestUpdateFeedWithInvalidFeedURL(t *testing.T) {
  253. client := createClient(t)
  254. feed, _ := createFeed(t, client)
  255. url := "invalid"
  256. if _, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{FeedURL: &url}); err == nil {
  257. t.Error(`Updating a feed with an invalid feed URL should not be possible`)
  258. }
  259. }
  260. func TestUpdateFeedSiteURL(t *testing.T) {
  261. client := createClient(t)
  262. feed, _ := createFeed(t, client)
  263. url := "https://www.example.org/"
  264. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{SiteURL: &url})
  265. if err != nil {
  266. t.Fatal(err)
  267. }
  268. if updatedFeed.SiteURL != url {
  269. t.Fatalf(`Wrong SiteURL, got %q instead of %q`, updatedFeed.SiteURL, url)
  270. }
  271. }
  272. func TestUpdateFeedWithEmptySiteURL(t *testing.T) {
  273. client := createClient(t)
  274. feed, _ := createFeed(t, client)
  275. url := ""
  276. if _, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{SiteURL: &url}); err == nil {
  277. t.Error(`Updating a feed with an empty site URL should not be possible`)
  278. }
  279. }
  280. func TestUpdateFeedWithInvalidSiteURL(t *testing.T) {
  281. client := createClient(t)
  282. feed, _ := createFeed(t, client)
  283. url := "invalid"
  284. if _, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{SiteURL: &url}); err == nil {
  285. t.Error(`Updating a feed with an invalid site URL should not be possible`)
  286. }
  287. }
  288. func TestUpdateFeedTitle(t *testing.T) {
  289. client := createClient(t)
  290. feed, _ := createFeed(t, client)
  291. newTitle := "My new feed"
  292. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Title: &newTitle})
  293. if err != nil {
  294. t.Fatal(err)
  295. }
  296. if updatedFeed.Title != newTitle {
  297. t.Fatalf(`Wrong title, got %q instead of %q`, updatedFeed.Title, newTitle)
  298. }
  299. }
  300. func TestUpdateFeedWithEmptyTitle(t *testing.T) {
  301. client := createClient(t)
  302. feed, _ := createFeed(t, client)
  303. title := ""
  304. if _, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Title: &title}); err == nil {
  305. t.Error(`Updating a feed with an empty title should not be possible`)
  306. }
  307. }
  308. func TestUpdateFeedCrawler(t *testing.T) {
  309. client := createClient(t)
  310. feed, _ := createFeed(t, client)
  311. crawler := true
  312. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Crawler: &crawler})
  313. if err != nil {
  314. t.Fatal(err)
  315. }
  316. if updatedFeed.Crawler != crawler {
  317. t.Fatalf(`Wrong crawler value, got "%v" instead of "%v"`, updatedFeed.Crawler, crawler)
  318. }
  319. if updatedFeed.Title != feed.Title {
  320. t.Fatalf(`The titles should be the same after update`)
  321. }
  322. crawler = false
  323. updatedFeed, err = client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Crawler: &crawler})
  324. if err != nil {
  325. t.Fatal(err)
  326. }
  327. if updatedFeed.Crawler != crawler {
  328. t.Fatalf(`Wrong crawler value, got "%v" instead of "%v"`, updatedFeed.Crawler, crawler)
  329. }
  330. }
  331. func TestUpdateFeedAllowSelfSignedCertificates(t *testing.T) {
  332. client := createClient(t)
  333. feed, _ := createFeed(t, client)
  334. selfSigned := true
  335. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{AllowSelfSignedCertificates: &selfSigned})
  336. if err != nil {
  337. t.Fatal(err)
  338. }
  339. if updatedFeed.AllowSelfSignedCertificates != selfSigned {
  340. t.Fatalf(`Wrong AllowSelfSignedCertificates value, got "%v" instead of "%v"`, updatedFeed.AllowSelfSignedCertificates, selfSigned)
  341. }
  342. selfSigned = false
  343. updatedFeed, err = client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{AllowSelfSignedCertificates: &selfSigned})
  344. if err != nil {
  345. t.Fatal(err)
  346. }
  347. if updatedFeed.AllowSelfSignedCertificates != selfSigned {
  348. t.Fatalf(`Wrong AllowSelfSignedCertificates value, got "%v" instead of "%v"`, updatedFeed.AllowSelfSignedCertificates, selfSigned)
  349. }
  350. }
  351. func TestUpdateFeedScraperRules(t *testing.T) {
  352. client := createClient(t)
  353. feed, _ := createFeed(t, client)
  354. scraperRules := "test"
  355. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{ScraperRules: &scraperRules})
  356. if err != nil {
  357. t.Fatal(err)
  358. }
  359. if updatedFeed.ScraperRules != scraperRules {
  360. t.Fatalf(`Wrong ScraperRules value, got "%v" instead of "%v"`, updatedFeed.ScraperRules, scraperRules)
  361. }
  362. scraperRules = ""
  363. updatedFeed, err = client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{ScraperRules: &scraperRules})
  364. if err != nil {
  365. t.Fatal(err)
  366. }
  367. if updatedFeed.ScraperRules != scraperRules {
  368. t.Fatalf(`Wrong ScraperRules value, got "%v" instead of "%v"`, updatedFeed.ScraperRules, scraperRules)
  369. }
  370. }
  371. func TestUpdateFeedRewriteRules(t *testing.T) {
  372. client := createClient(t)
  373. feed, _ := createFeed(t, client)
  374. rewriteRules := "test"
  375. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{RewriteRules: &rewriteRules})
  376. if err != nil {
  377. t.Fatal(err)
  378. }
  379. if updatedFeed.RewriteRules != rewriteRules {
  380. t.Fatalf(`Wrong RewriteRules value, got "%v" instead of "%v"`, updatedFeed.RewriteRules, rewriteRules)
  381. }
  382. rewriteRules = ""
  383. updatedFeed, err = client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{RewriteRules: &rewriteRules})
  384. if err != nil {
  385. t.Fatal(err)
  386. }
  387. if updatedFeed.RewriteRules != rewriteRules {
  388. t.Fatalf(`Wrong RewriteRules value, got "%v" instead of "%v"`, updatedFeed.RewriteRules, rewriteRules)
  389. }
  390. }
  391. func TestUpdateFeedKeeplistRules(t *testing.T) {
  392. client := createClient(t)
  393. feed, _ := createFeed(t, client)
  394. keeplistRules := "test"
  395. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{KeeplistRules: &keeplistRules})
  396. if err != nil {
  397. t.Fatal(err)
  398. }
  399. if updatedFeed.KeeplistRules != keeplistRules {
  400. t.Fatalf(`Wrong KeeplistRules value, got "%v" instead of "%v"`, updatedFeed.KeeplistRules, keeplistRules)
  401. }
  402. keeplistRules = ""
  403. updatedFeed, err = client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{KeeplistRules: &keeplistRules})
  404. if err != nil {
  405. t.Fatal(err)
  406. }
  407. if updatedFeed.KeeplistRules != keeplistRules {
  408. t.Fatalf(`Wrong KeeplistRules value, got "%v" instead of "%v"`, updatedFeed.KeeplistRules, keeplistRules)
  409. }
  410. }
  411. func TestUpdateFeedUserAgent(t *testing.T) {
  412. client := createClient(t)
  413. feed, _ := createFeed(t, client)
  414. userAgent := "test"
  415. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{UserAgent: &userAgent})
  416. if err != nil {
  417. t.Fatal(err)
  418. }
  419. if updatedFeed.UserAgent != userAgent {
  420. t.Fatalf(`Wrong UserAgent value, got "%v" instead of "%v"`, updatedFeed.UserAgent, userAgent)
  421. }
  422. userAgent = ""
  423. updatedFeed, err = client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{UserAgent: &userAgent})
  424. if err != nil {
  425. t.Fatal(err)
  426. }
  427. if updatedFeed.UserAgent != userAgent {
  428. t.Fatalf(`Wrong UserAgent value, got "%v" instead of "%v"`, updatedFeed.UserAgent, userAgent)
  429. }
  430. }
  431. func TestUpdateFeedCookie(t *testing.T) {
  432. client := createClient(t)
  433. feed, _ := createFeed(t, client)
  434. cookie := "test"
  435. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Cookie: &cookie})
  436. if err != nil {
  437. t.Fatal(err)
  438. }
  439. if updatedFeed.Cookie != cookie {
  440. t.Fatalf(`Wrong Cookie value, got "%v" instead of "%v"`, updatedFeed.Cookie, cookie)
  441. }
  442. cookie = ""
  443. updatedFeed, err = client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Cookie: &cookie})
  444. if err != nil {
  445. t.Fatal(err)
  446. }
  447. if updatedFeed.Cookie != cookie {
  448. t.Fatalf(`Wrong Cookie value, got "%v" instead of "%v"`, updatedFeed.Cookie, cookie)
  449. }
  450. }
  451. func TestUpdateFeedUsername(t *testing.T) {
  452. client := createClient(t)
  453. feed, _ := createFeed(t, client)
  454. username := "test"
  455. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Username: &username})
  456. if err != nil {
  457. t.Fatal(err)
  458. }
  459. if updatedFeed.Username != username {
  460. t.Fatalf(`Wrong Username value, got "%v" instead of "%v"`, updatedFeed.Username, username)
  461. }
  462. username = ""
  463. updatedFeed, err = client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Username: &username})
  464. if err != nil {
  465. t.Fatal(err)
  466. }
  467. if updatedFeed.Username != username {
  468. t.Fatalf(`Wrong Username value, got "%v" instead of "%v"`, updatedFeed.Username, username)
  469. }
  470. }
  471. func TestUpdateFeedPassword(t *testing.T) {
  472. client := createClient(t)
  473. feed, _ := createFeed(t, client)
  474. password := "test"
  475. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Password: &password})
  476. if err != nil {
  477. t.Fatal(err)
  478. }
  479. if updatedFeed.Password != password {
  480. t.Fatalf(`Wrong Password value, got "%v" instead of "%v"`, updatedFeed.Password, password)
  481. }
  482. password = ""
  483. updatedFeed, err = client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{Password: &password})
  484. if err != nil {
  485. t.Fatal(err)
  486. }
  487. if updatedFeed.Password != password {
  488. t.Fatalf(`Wrong Password value, got "%v" instead of "%v"`, updatedFeed.Password, password)
  489. }
  490. }
  491. func TestUpdateFeedCategory(t *testing.T) {
  492. client := createClient(t)
  493. feed, _ := createFeed(t, client)
  494. newCategory, err := client.CreateCategory("my new category")
  495. if err != nil {
  496. t.Fatal(err)
  497. }
  498. updatedFeed, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{CategoryID: &newCategory.ID})
  499. if err != nil {
  500. t.Fatal(err)
  501. }
  502. if updatedFeed.Category.ID != newCategory.ID {
  503. t.Fatalf(`Wrong CategoryID value, got "%v" instead of "%v"`, updatedFeed.Category.ID, newCategory.ID)
  504. }
  505. }
  506. func TestUpdateFeedWithEmptyCategoryID(t *testing.T) {
  507. client := createClient(t)
  508. feed, _ := createFeed(t, client)
  509. categoryID := int64(0)
  510. if _, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{CategoryID: &categoryID}); err == nil {
  511. t.Error(`Updating a feed with an empty category should not be possible`)
  512. }
  513. }
  514. func TestUpdateFeedWithInvalidCategoryID(t *testing.T) {
  515. client := createClient(t)
  516. feed, _ := createFeed(t, client)
  517. categoryID := int64(-1)
  518. if _, err := client.UpdateFeed(feed.ID, &miniflux.FeedModificationRequest{CategoryID: &categoryID}); err == nil {
  519. t.Error(`Updating a feed with an invalid category should not be possible`)
  520. }
  521. }
  522. func TestMarkFeedAsRead(t *testing.T) {
  523. client := createClient(t)
  524. feed, _ := createFeed(t, client)
  525. results, err := client.FeedEntries(feed.ID, nil)
  526. if err != nil {
  527. t.Fatalf(`Failed to get entries: %v`, err)
  528. }
  529. if results.Total == 0 {
  530. t.Fatalf(`Invalid number of entries: %d`, results.Total)
  531. }
  532. if results.Entries[0].Status != miniflux.EntryStatusUnread {
  533. t.Fatalf(`Invalid entry status, got %q instead of %q`, results.Entries[0].Status, miniflux.EntryStatusUnread)
  534. }
  535. if err := client.MarkFeedAsRead(feed.ID); err != nil {
  536. t.Fatalf(`Failed to mark feed as read: %v`, err)
  537. }
  538. results, err = client.FeedEntries(feed.ID, nil)
  539. if err != nil {
  540. t.Fatalf(`Failed to get updated entries: %v`, err)
  541. }
  542. for _, entry := range results.Entries {
  543. if entry.Status != miniflux.EntryStatusRead {
  544. t.Errorf(`Status for entry %d was %q instead of %q`, entry.ID, entry.Status, miniflux.EntryStatusRead)
  545. }
  546. }
  547. }
  548. func TestFetchCounters(t *testing.T) {
  549. client := createClient(t)
  550. feed, _ := createFeed(t, client)
  551. results, err := client.FeedEntries(feed.ID, nil)
  552. if err != nil {
  553. t.Fatalf(`Failed to get entries: %v`, err)
  554. }
  555. counters, err := client.FetchCounters()
  556. if err != nil {
  557. t.Fatalf(`Failed to fetch unread count: %v`, err)
  558. }
  559. unreadCounter, exists := counters.UnreadCounters[feed.ID]
  560. if !exists {
  561. unreadCounter = 0
  562. }
  563. unreadExpected := 0
  564. for _, entry := range results.Entries {
  565. if entry.Status == miniflux.EntryStatusUnread {
  566. unreadExpected++
  567. }
  568. }
  569. if unreadExpected != unreadCounter {
  570. t.Errorf(`Expected %d unread entries but %d instead`, unreadExpected, unreadCounter)
  571. }
  572. }
  573. func TestDeleteFeed(t *testing.T) {
  574. client := createClient(t)
  575. feed, _ := createFeed(t, client)
  576. if err := client.DeleteFeed(feed.ID); err != nil {
  577. t.Fatal(err)
  578. }
  579. }
  580. func TestRefreshFeed(t *testing.T) {
  581. client := createClient(t)
  582. feed, _ := createFeed(t, client)
  583. if err := client.RefreshFeed(feed.ID); err != nil {
  584. t.Fatal(err)
  585. }
  586. }
  587. func TestGetFeed(t *testing.T) {
  588. client := createClient(t)
  589. feed, category := createFeed(t, client)
  590. if feed.Title != testFeedTitle {
  591. t.Fatalf(`Invalid feed title, got "%v" instead of "%v"`, feed.Title, testFeedTitle)
  592. }
  593. if feed.SiteURL != testWebsiteURL {
  594. t.Fatalf(`Invalid site URL, got "%v" instead of "%v"`, feed.SiteURL, testWebsiteURL)
  595. }
  596. if feed.FeedURL != testFeedURL {
  597. t.Fatalf(`Invalid feed URL, got "%v" instead of "%v"`, feed.FeedURL, testFeedURL)
  598. }
  599. if feed.Category.ID != category.ID {
  600. t.Fatalf(`Invalid feed category ID, got "%v" instead of "%v"`, feed.Category.ID, category.ID)
  601. }
  602. if feed.Category.UserID != category.UserID {
  603. t.Fatalf(`Invalid feed category user ID, got "%v" instead of "%v"`, feed.Category.UserID, category.UserID)
  604. }
  605. if feed.Category.Title != category.Title {
  606. t.Fatalf(`Invalid feed category title, got "%v" instead of "%v"`, feed.Category.Title, category.Title)
  607. }
  608. }
  609. func TestGetFeedIcon(t *testing.T) {
  610. client := createClient(t)
  611. feed, _ := createFeed(t, client)
  612. feedIcon, err := client.FeedIcon(feed.ID)
  613. if err != nil {
  614. t.Fatal(err)
  615. }
  616. if feedIcon.ID == 0 {
  617. t.Fatalf(`Invalid feed icon ID, got "%d"`, feedIcon.ID)
  618. }
  619. expectedMimeType := "image/x-icon"
  620. if feedIcon.MimeType != expectedMimeType {
  621. t.Fatalf(`Invalid feed icon mime type, got %q instead of %q`, feedIcon.MimeType, expectedMimeType)
  622. }
  623. if !strings.HasPrefix(feedIcon.Data, expectedMimeType) {
  624. t.Fatalf(`Invalid feed icon data, got "%v"`, feedIcon.Data)
  625. }
  626. feedIcon, err = client.Icon(feedIcon.ID)
  627. if err != nil {
  628. t.Fatal(err)
  629. }
  630. if feedIcon.MimeType != expectedMimeType {
  631. t.Fatalf(`Invalid feed icon mime type, got %q instead of %q`, feedIcon.MimeType, expectedMimeType)
  632. }
  633. if !strings.HasPrefix(feedIcon.Data, expectedMimeType) {
  634. t.Fatalf(`Invalid feed icon data, got "%v"`, feedIcon.Data)
  635. }
  636. }
  637. func TestGetFeedIconNotFound(t *testing.T) {
  638. client := createClient(t)
  639. if _, err := client.FeedIcon(42); err == nil {
  640. t.Fatalf(`The feed icon should be null`)
  641. }
  642. }
  643. func TestGetFeeds(t *testing.T) {
  644. client := createClient(t)
  645. feed, category := createFeed(t, client)
  646. feeds, err := client.Feeds()
  647. if err != nil {
  648. t.Fatal(err)
  649. }
  650. if len(feeds) != 1 {
  651. t.Fatalf(`Invalid number of feeds`)
  652. }
  653. if feeds[0].ID != feed.ID {
  654. t.Fatalf(`Invalid feed ID, got "%v" instead of "%v"`, feeds[0].ID, feed.ID)
  655. }
  656. if feeds[0].Title != testFeedTitle {
  657. t.Fatalf(`Invalid feed title, got "%v" instead of "%v"`, feeds[0].Title, testFeedTitle)
  658. }
  659. if feeds[0].SiteURL != testWebsiteURL {
  660. t.Fatalf(`Invalid site URL, got "%v" instead of "%v"`, feeds[0].SiteURL, testWebsiteURL)
  661. }
  662. if feeds[0].FeedURL != testFeedURL {
  663. t.Fatalf(`Invalid feed URL, got "%v" instead of "%v"`, feeds[0].FeedURL, testFeedURL)
  664. }
  665. if feeds[0].Category.ID != category.ID {
  666. t.Fatalf(`Invalid feed category ID, got "%v" instead of "%v"`, feeds[0].Category.ID, category.ID)
  667. }
  668. if feeds[0].Category.UserID != category.UserID {
  669. t.Fatalf(`Invalid feed category user ID, got "%v" instead of "%v"`, feeds[0].Category.UserID, category.UserID)
  670. }
  671. if feeds[0].Category.Title != category.Title {
  672. t.Fatalf(`Invalid feed category title, got "%v" instead of "%v"`, feeds[0].Category.Title, category.Title)
  673. }
  674. }
  675. func TestGetFeedsByCategory(t *testing.T) {
  676. client := createClient(t)
  677. feed, category := createFeed(t, client)
  678. feeds, err := client.CategoryFeeds(category.ID)
  679. if err != nil {
  680. t.Fatal(err)
  681. }
  682. if len(feeds) != 1 {
  683. t.Fatalf(`Invalid number of feeds`)
  684. }
  685. if feeds[0].ID != feed.ID {
  686. t.Fatalf(`Invalid feed ID, got "%v" instead of "%v"`, feeds[0].ID, feed.ID)
  687. }
  688. if feeds[0].Title != testFeedTitle {
  689. t.Fatalf(`Invalid feed title, got "%v" instead of "%v"`, feeds[0].Title, testFeedTitle)
  690. }
  691. if feeds[0].SiteURL != testWebsiteURL {
  692. t.Fatalf(`Invalid site URL, got "%v" instead of "%v"`, feeds[0].SiteURL, testWebsiteURL)
  693. }
  694. if feeds[0].FeedURL != testFeedURL {
  695. t.Fatalf(`Invalid feed URL, got "%v" instead of "%v"`, feeds[0].FeedURL, testFeedURL)
  696. }
  697. if feeds[0].Category.ID != category.ID {
  698. t.Fatalf(`Invalid feed category ID, got "%v" instead of "%v"`, feeds[0].Category.ID, category.ID)
  699. }
  700. if feeds[0].Category.UserID != category.UserID {
  701. t.Fatalf(`Invalid feed category user ID, got "%v" instead of "%v"`, feeds[0].Category.UserID, category.UserID)
  702. }
  703. if feeds[0].Category.Title != category.Title {
  704. t.Fatalf(`Invalid feed category title, got "%v" instead of "%v"`, feeds[0].Category.Title, category.Title)
  705. }
  706. }