summaryrefslogtreecommitdiff
path: root/test/rsspp_rssparser.cpp
blob: 048b3db7054296ddfd9a6bbb5757ed72890b592d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include "rss/rssparser.h"

#include "3rd-party/catch.hpp"
#include "test_helpers/envvar.h"

TEST_CASE("W3CDTF parser extracts date and time from any valid string",
	"[rsspp::RssParser]")
{
	SECTION("year only") {
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822("2008") ==
			"Tue, 01 Jan 2008 00:00:00 +0000");
	}

	SECTION("year-month only") {
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822("2008-12") ==
			"Mon, 01 Dec 2008 00:00:00 +0000");
	}

	SECTION("year-month-day only") {
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822("2008-12-30") ==
			"Tue, 30 Dec 2008 00:00:00 +0000");
	}

	SECTION("date and hours") {
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822("2008-12-30T13") ==
			"Tue, 30 Dec 2008 13:00:00 +0000");
	}

	SECTION("date, hours, and minutes") {
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822("2008-12-30T13:21") ==
			"Tue, 30 Dec 2008 13:21:00 +0000");
	}

	SECTION("date and time, without timezone") {
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822("2008-12-30T13:21:59") ==
			"Tue, 30 Dec 2008 13:21:59 +0000");
	}

	SECTION("date and time with Z timezone") {
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822(
				"2008-12-30T13:03:15Z") ==
			"Tue, 30 Dec 2008 13:03:15 +0000");
	}

	SECTION("date and time with -08:00 timezone") {
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822(
				"2008-12-30T10:03:15-08:00") ==
			"Tue, 30 Dec 2008 18:03:15 +0000");
	}
}

TEST_CASE("W3CDTF parser returns empty string on invalid input",
	"[rsspp::RssParser]")
{
	REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822("foobar") == "");
	REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822("-3") == "");
	REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822("") == "");
}

TEST_CASE(
	"W3C DTF to RFC 822 conversion does not take into account the local "
	"timezone (#369)",
	"[rsspp::RssParser]")
{
	auto input = "2008-12-30T10:03:15-08:00";
	auto expected = "Tue, 30 Dec 2008 18:03:15 +0000";

	test_helpers::TzEnvVar tzEnv;

	// US/Pacific and Australia/Sydney have pretty much opposite DST
	// schedules, so for any given moment in time one of the following two
	// sections will be observing DST while other won't
	SECTION("Timezone Pacific") {
		tzEnv.set("US/Pacific");
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822(input) ==
			expected);
	}

	SECTION("Timezone Australia") {
		tzEnv.set("Australia/Sydney");
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822(input) ==
			expected);
	}

	// During October, both US/Pacific and Australia/Sydney are observing
	// DST. Arizona and UTC *never* observe it, though, so the following two
	// tests will cover October
	SECTION("Timezone Arizona") {
		tzEnv.set("US/Arizona");
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822(input) ==
			expected);
	}

	SECTION("Timezone UTC") {
		tzEnv.set("UTC");
		REQUIRE(rsspp::RssParser::w3cdtf_to_rfc822(input) ==
			expected);
	}
}