feed_test.go 22 KB

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