response_handler_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package fetcher // import "miniflux.app/v2/internal/reader/fetcher"
  4. import (
  5. "net/http"
  6. "testing"
  7. )
  8. func TestIsModified(t *testing.T) {
  9. var cachedEtag = "abc123"
  10. var cachedLastModified = "Wed, 21 Oct 2015 07:28:00 GMT"
  11. var testCases = map[string]struct {
  12. Status int
  13. LastModified string
  14. ETag string
  15. IsModified bool
  16. }{
  17. "Unmodified 304": {
  18. Status: 304,
  19. LastModified: cachedLastModified,
  20. ETag: cachedEtag,
  21. IsModified: false,
  22. },
  23. "Unmodified 200": {
  24. Status: 200,
  25. LastModified: cachedLastModified,
  26. ETag: cachedEtag,
  27. IsModified: false,
  28. },
  29. // This case is invalid per RFC9110 8.8.1, so ETag takes precedence.
  30. "Last-Modified changed only": {
  31. Status: 200,
  32. LastModified: "Thu, 22 Oct 2015 07:28:00 GMT",
  33. ETag: cachedEtag,
  34. IsModified: false,
  35. },
  36. "ETag changed only": {
  37. Status: 200,
  38. LastModified: cachedLastModified,
  39. ETag: "xyz789",
  40. IsModified: true,
  41. },
  42. "ETag and Last-Modified changed": {
  43. Status: 200,
  44. LastModified: "Thu, 22 Oct 2015 07:28:00 GMT",
  45. ETag: "xyz789",
  46. IsModified: true,
  47. },
  48. }
  49. for name, tc := range testCases {
  50. t.Run(name, func(tt *testing.T) {
  51. header := http.Header{}
  52. header.Add("Last-Modified", tc.LastModified)
  53. header.Add("ETag", tc.ETag)
  54. rh := ResponseHandler{
  55. httpResponse: &http.Response{
  56. StatusCode: tc.Status,
  57. Header: header,
  58. },
  59. }
  60. if tc.IsModified != rh.IsModified(cachedEtag, cachedLastModified) {
  61. tt.Error(name)
  62. }
  63. })
  64. }
  65. }