Diff options
| author | Bryce Kwon <bryce@brycekwon.com> | |
|---|---|---|
| committer | Bryce Kwon <bryce@brycekwon.com> | |
| commit | ||
| parent | ||
| tree | ||
| download | ||
Check the feed's elements, limits and path
No entry content was checked, so a wrong link, id or date passed, and
the path control looked at the status alone. A max-atom-items of 0 or
below, all=1 and the epoch an empty feed takes had no test. The xmllint
checks read a feed an earlier test left behind, which was another feed
whenever that test failed early.
| -rwxr-xr-x | tests/t0111-atom.sh | 134 |
1 file changed, 102 insertions, 32 deletions
diff --git a/tests/t0111-atom.sh b/tests/t0111-atom.sh index 568fea4..684bdb7 100755 --- a/tests/t0111-atom.sh +++ b/tests/t0111-atom.sh @@ -1,51 +1,113 @@ #!/bin/sh # The atom page serves recent history as a feed. The checks read the content -# type, count the entries against the max-atom-items cap, and hand the feed -# to xmllint where installed, a far stricter reader than any grep here. +# type, the feed and entry elements, what max-atom-items and a path let in, +# and the escaping XML needs, and hand each feed to xmllint where installed. test_description='Check the atom feed' . ./setup.sh -test_expect_success 'generate foo/atom' ' - cgit_url "foo/atom" >tmp -' +test_lazy_prereq XMLLINT 'command -v xmllint' +# The feed's own updated is the newest commit's, in UTC like every feed date. test_expect_success 'the response is an atom feed' ' - head -n 1 tmp | grep "Status: 200 OK" && - sed "/^$/q" tmp | grep "Content-Type: application/atom+xml" && + cgit_ok_url "foo/atom" >tmp && + sed "/^$/q" tmp | grep "^Content-Type: application/atom+xml" && strip_headers <tmp >feed && grep "<feed xmlns=.http://www.w3.org/2005/Atom.>" feed && - grep "<title>foo, branch master</title>" feed + grep "<title>foo, branch master</title>" feed && + sed -n "1,/^<entry>$/p" feed >top && + grep "^<updated>2005-04-01T11:14:15Z</updated>$" top +' + +test_expect_success XMLLINT 'the feed is well-formed xml' ' + cgit_ok_url "foo/atom" >tmp && + strip_headers <tmp >feed && + xmllint --noout feed ' test_expect_success 'every commit of a small repository is an entry' ' - test $(grep -c "<entry>" feed) -eq 5 && - grep "<title>commit 1</title>" feed && - grep "<title>commit 5</title>" feed + cgit_ok_url "foo/atom" >tmp && + test $(grep -c "<entry>" tmp) -eq 5 && + grep "<title>commit 1</title>" tmp && + grep "<title>commit 5</title>" tmp ' -test_expect_success 'ten entries is the default ceiling' ' - cgit_url "bar/atom" >tmp && +# The author and committer dates differ, so each lands in its own element, and +# a second branch holds a commit only all=1 lets in. +test_expect_success 'set up a repo with a commit dated twice' ' + test_create_repo repos/stamped && + ( + cd repos/stamped && + GIT_AUTHOR_DATE="@1112354055 +0200" \ + GIT_COMMITTER_DATE="@1112911993 +0000" \ + git commit --allow-empty -m stamped -m "the body" && + git checkout -b side && + git commit --allow-empty -m aside && + git checkout - + ) && + cgitrc_repo stampedrc stamped +' + +test_expect_success 'an entry carries the commit it stands for' ' + hex=$(git -C repos/stamped rev-parse master) && + algo=$(git -C repos/stamped rev-parse --show-object-format) && + cgit_ok stampedrc "url=stamped/atom" >tmp && strip_headers <tmp >feed && - test $(grep -c "<entry>" feed) -eq 10 && - grep "<title>commit 50</title>" feed && - ! grep "<title>commit 40</title>" feed + sed -n "1,/^<entry>$/p" feed >top && + grep "^<updated>2005-04-07T22:13:13Z</updated>$" top && + sed -n "/^<entry>$/,/^<\/entry>$/p" feed | tr -d "\047" >actual && + cat >expect <<-EOF && + <entry> + <title>stamped</title> + <updated>2005-04-07T22:13:13Z</updated> + <author> + <name>A U Thor</name> + <email>author@example.com</email> + </author> + <published>2005-04-01T11:14:15Z</published> + <link rel=alternate type=text/html href=http://localhost/stamped/commit/?id=$hex/> + <id>urn:$algo:$hex</id> + <content type=text>the body + </content> + </entry> + EOF + test_cmp expect actual +' + +test_expect_success 'all=1 follows every branch and names none' ' + cgit_ok stampedrc "url=stamped/atom&all=1" >tmp && + grep "<title>stamped</title>" tmp && + grep "<title>aside</title>" tmp && + ! grep ", branch" tmp && + cgit_ok stampedrc "url=stamped/atom" >tmp && + grep "<title>stamped, branch master</title>" tmp && + ! grep "<title>aside</title>" tmp +' + +test_expect_success 'ten entries is the default ceiling' ' + cgit_ok_url "bar/atom" >tmp && + test $(grep -c "<entry>" tmp) -eq 10 && + grep "<title>commit 50</title>" tmp && + ! grep "<title>commit 40</title>" tmp ' test_expect_success 'max-atom-items overrides the ceiling' ' cgitrc_repo atomrc bar max-atom-items=3 && - cgit_rc atomrc "url=bar/atom" >tmp && - strip_headers <tmp >feed && - test $(grep -c "<entry>" feed) -eq 3 + cgit_ok atomrc "url=bar/atom" >tmp && + test $(grep -c "<entry>" tmp) -eq 3 && + grep "<title>commit 48</title>" tmp ' -test_lazy_prereq XMLLINT 'command -v xmllint' - -test_expect_success XMLLINT 'the feed is well-formed xml' ' - cgit_url "foo/atom" >tmp && - strip_headers <tmp >feed && - xmllint --noout feed +test_expect_success 'max-atom-items 0 empties the feed and below 0 lets all in' ' + cgitrc_repo atomrc bar max-atom-items=0 && + cgit_ok atomrc "url=bar/atom" >tmp && + grep "<title>bar, branch master</title>" tmp && + grep "^<updated>1970-01-01T00:00:00Z</updated>$" tmp && + ! grep "<entry>" tmp && + cgitrc_repo atomrc bar max-atom-items=-1 && + cgit_ok atomrc "url=bar/atom" >tmp && + test $(grep -c "<entry>" tmp) -eq 50 ' # A path starting with a colon would reach git as pathspec magic, which the @@ -53,8 +115,10 @@ test_expect_success XMLLINT 'the feed is well-formed xml' ' test_expect_success 'a path with pathspec magic is refused' ' cgit_url "foo/atom/%3A%28icase%29FILE-1" >tmp && grep "^Status: 400" tmp && - cgit_url "foo/atom/file-1" >tmp && - grep "^Status: 200" tmp + cgit_ok_url "foo/atom/file-1" >tmp && + test $(grep -c "<entry>" tmp) -eq 1 && + grep "<title>commit 1</title>" tmp && + grep "<title>foo/file-1, branch master</title>" tmp ' test_expect_success 'enable-plain-email=0 leaves the address out of the feed' ' @@ -67,26 +131,30 @@ test_expect_success 'enable-plain-email=0 leaves the address out of the feed' ' test_expect_success 'the feed link encodes the repository and the branch' ' cgitrc_copy feedrc && - CGIT_CONFIG="$PWD/feedrc" HTTP_HOST=example.org QUERY_STRING="url=foo%2Bbar/log/&h=1%2B2" cgit >tmp && + CGIT_CONFIG="$PWD/feedrc" HTTP_HOST=example.org QUERY_STRING="url=foo%2Bbar/log/&h=1%2B2" cgit >tmp 2>err && + test_must_be_empty err && + grep "^Status: 200" tmp && grep "title=.Atom feed. href=.http://example.org/foo%2Bbar/atom/?h=1%2B2." tmp ' # A reader may subscribe before the first push, and the page every other view -# of an empty repository falls back to is no feed it can read. +# of an empty repository falls back to is no feed it can read. Atom wants an +# updated element even then, and the epoch stands in. test_expect_success 'an empty repository answers with a feed of no entries' ' git init -q --bare repos/empty.git && cgitrc_repo emptyrc empty "repo.path=$PWD/repos/empty.git" && - cgit_rc emptyrc "url=empty/atom" >tmp && - head -n 1 tmp | grep "Status: 200 OK" && + cgit_ok emptyrc "url=empty/atom" >tmp && sed "/^$/q" tmp | grep "Content-Type: application/atom+xml" && strip_headers <tmp >feed && grep "<title>empty</title>" feed && - grep "<updated>" feed && + grep "^<updated>1970-01-01T00:00:00Z</updated>$" feed && ! grep "<entry>" feed && grep "</feed>" feed ' test_expect_success XMLLINT 'the empty feed is well-formed xml' ' + cgit_ok emptyrc "url=empty/atom" >tmp && + strip_headers <tmp >feed && xmllint --noout feed ' @@ -132,6 +200,8 @@ test_expect_success 'the feed escapes markup and replaces what XML forbids' ' ' test_expect_success XMLLINT 'that feed is well-formed xml' ' + cgit_ok oddrc "url=odd/atom" >tmp && + strip_headers <tmp >oddfeed && xmllint --noout oddfeed ' |
