| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
- // SPDX-License-Identifier: Apache-2.0
- package fetcher // import "miniflux.app/v2/internal/reader/fetcher"
- import (
- "net/http"
- "testing"
- "time"
- )
- func TestIsModified(t *testing.T) {
- var cachedEtag = "abc123"
- var cachedLastModified = "Wed, 21 Oct 2015 07:28:00 GMT"
- var testCases = map[string]struct {
- Status int
- LastModified string
- ETag string
- IsModified bool
- }{
- "Unmodified 304": {
- Status: 304,
- LastModified: cachedLastModified,
- ETag: cachedEtag,
- IsModified: false,
- },
- "Unmodified 200": {
- Status: 200,
- LastModified: cachedLastModified,
- ETag: cachedEtag,
- IsModified: false,
- },
- // ETag takes precedence per RFC9110 8.8.1.
- "Last-Modified changed only": {
- Status: 200,
- LastModified: "Thu, 22 Oct 2015 07:28:00 GMT",
- ETag: cachedEtag,
- IsModified: false,
- },
- "ETag changed only": {
- Status: 200,
- LastModified: cachedLastModified,
- ETag: "xyz789",
- IsModified: true,
- },
- "ETag and Last-Modified changed": {
- Status: 200,
- LastModified: "Thu, 22 Oct 2015 07:28:00 GMT",
- ETag: "xyz789",
- IsModified: true,
- },
- }
- for name, tc := range testCases {
- t.Run(name, func(tt *testing.T) {
- header := http.Header{}
- header.Add("Last-Modified", tc.LastModified)
- header.Add("ETag", tc.ETag)
- rh := ResponseHandler{
- httpResponse: &http.Response{
- StatusCode: tc.Status,
- Header: header,
- },
- }
- if tc.IsModified != rh.IsModified(cachedEtag, cachedLastModified) {
- tt.Error(name)
- }
- })
- }
- }
- func TestRetryDelay(t *testing.T) {
- var testCases = map[string]struct {
- RetryAfterHeader string
- ExpectedDelay int
- }{
- "Empty header": {
- RetryAfterHeader: "",
- ExpectedDelay: 0,
- },
- "Integer value": {
- RetryAfterHeader: "42",
- ExpectedDelay: 42,
- },
- "HTTP-date": {
- RetryAfterHeader: time.Now().Add(42 * time.Second).Format(time.RFC1123),
- ExpectedDelay: 41,
- },
- }
- for name, tc := range testCases {
- t.Run(name, func(tt *testing.T) {
- header := http.Header{}
- header.Add("Retry-After", tc.RetryAfterHeader)
- rh := ResponseHandler{
- httpResponse: &http.Response{
- Header: header,
- },
- }
- if tc.ExpectedDelay != rh.ParseRetryDelay() {
- tt.Errorf("Expected %d, got %d for scenario %q", tc.ExpectedDelay, rh.ParseRetryDelay(), name)
- }
- })
- }
- }
|