Skip to content

Commit 87f0f23

Browse files
committed
Add functional tests for the packages Atom feed (#6910)
Address #6898
1 parent fa6ae9c commit 87f0f23

2 files changed

Lines changed: 144 additions & 0 deletions

File tree

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.Linq;
6+
using System.Net;
7+
using System.Net.Http;
8+
using System.ServiceModel.Syndication;
9+
using System.Threading.Tasks;
10+
using System.Xml;
11+
using NuGet.Versioning;
12+
using Xunit;
13+
using Xunit.Abstractions;
14+
15+
namespace NuGetGallery.FunctionalTests.AtomFeed
16+
{
17+
public class AtomFeedTests : GalleryTestBase
18+
{
19+
public AtomFeedTests(ITestOutputHelper testOutputHelper) : base(testOutputHelper)
20+
{
21+
}
22+
23+
[Fact]
24+
[Priority(2)]
25+
[Category("P2Tests")]
26+
public async Task IsParsableForAvailablePackage()
27+
{
28+
// Arrange
29+
var feedUrl = new Uri(new Uri(UrlHelper.BaseUrl), $"/packages/{Constants.TestPackageId}/atom.xml");
30+
31+
// Act
32+
using (var httpClient = new HttpClient())
33+
using (var response = await httpClient.GetAsync(feedUrl))
34+
{
35+
// Assert
36+
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
37+
var contentType = Assert.Single(response.Content.Headers.GetValues("Content-Type"));
38+
Assert.Equal("application/atom+xml; charset=utf-8", contentType);
39+
40+
var feed = await ReadFeedAsync(response);
41+
Assert.Contains(Constants.TestPackageId, feed.Title.Text);
42+
Assert.NotEmpty(feed.Items);
43+
foreach (var item in feed.Items)
44+
{
45+
Assert.Contains(Constants.TestPackageId, item.Title.Text);
46+
}
47+
}
48+
}
49+
50+
[Theory]
51+
[Priority(2)]
52+
[Category("P2Tests")]
53+
[InlineData(false)]
54+
[InlineData(true)]
55+
public async Task ObservesPrerelParameter(bool prerel)
56+
{
57+
// Arrange
58+
var feedUrl = new Uri(new Uri(UrlHelper.BaseUrl), $"/packages/Newtonsoft.Json/atom.xml?prerel={prerel}");
59+
60+
// Act
61+
using (var httpClient = new HttpClient())
62+
using (var response = await httpClient.GetAsync(feedUrl))
63+
{
64+
// Assert
65+
var feed = await ReadFeedAsync(response);
66+
foreach (var item in feed.Items)
67+
{
68+
var version = item.Title.Text.Split(' ').Last();
69+
Assert.True(NuGetVersion.TryParse(version, out var parsedVersion), $"The version '{version}' is not parsable.");
70+
if (!prerel)
71+
{
72+
Assert.False(parsedVersion.IsPrerelease, $"The version '{version}' should not be included since it is prerelease.");
73+
}
74+
}
75+
}
76+
}
77+
78+
[Fact]
79+
[Priority(2)]
80+
[Category("P2Tests")]
81+
public async Task DefaultsToIncludingPrerel()
82+
{
83+
// Arrange
84+
var feedUrl = new Uri(new Uri(UrlHelper.BaseUrl), $"/packages/Newtonsoft.Json/atom.xml");
85+
86+
// Act
87+
using (var httpClient = new HttpClient())
88+
using (var response = await httpClient.GetAsync(feedUrl))
89+
{
90+
// Assert
91+
var feed = await ReadFeedAsync(response);
92+
var prerelCount = 0;
93+
foreach (var item in feed.Items)
94+
{
95+
var version = item.Title.Text.Split(' ').Last();
96+
Assert.True(NuGetVersion.TryParse(version, out var parsedVersion), $"The version '{version}' is not parsable.");
97+
if (parsedVersion.IsPrerelease)
98+
{
99+
prerelCount++;
100+
}
101+
}
102+
103+
Assert.InRange(prerelCount, 1, feed.Items.Count());
104+
}
105+
}
106+
107+
[Fact]
108+
[Priority(2)]
109+
[Category("P2Tests")]
110+
public async Task DoesNotExistForPackageThatDoesNotExist()
111+
{
112+
// Arrange
113+
// This package ID can never exist since an ID can't have two hyphens next to each other.
114+
var feedUrl = new Uri(new Uri(UrlHelper.BaseUrl), $"/packages/Base--TestPackage/atom.xml");
115+
116+
// Act
117+
using (var httpClient = new HttpClient())
118+
using (var response = await httpClient.GetAsync(feedUrl))
119+
{
120+
// Assert
121+
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
122+
var contentType = Assert.Single(response.Content.Headers.GetValues("Content-Type"));
123+
Assert.Equal("text/html; charset=utf-8", contentType);
124+
}
125+
}
126+
127+
private static async Task<SyndicationFeed> ReadFeedAsync(HttpResponseMessage response)
128+
{
129+
var formatter = new Atom10FeedFormatter();
130+
using (var stream = await response.Content.ReadAsStreamAsync())
131+
using (var xmlReader = XmlReader.Create(stream, new XmlReaderSettings
132+
{
133+
DtdProcessing = DtdProcessing.Ignore,
134+
}))
135+
{
136+
formatter.ReadFrom(xmlReader);
137+
}
138+
139+
return formatter.Feed;
140+
}
141+
}
142+
}

tests/NuGetGallery.FunctionalTests/NuGetGallery.FunctionalTests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
<Reference Include="Microsoft.CSharp" />
6262
<Reference Include="System.IO.Compression" />
6363
<Reference Include="System.Net.Http" />
64+
<Reference Include="System.ServiceModel" />
6465
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
6566
<HintPath>..\..\packages\System.ValueTuple.4.5.0\lib\netstandard1.0\System.ValueTuple.dll</HintPath>
6667
</Reference>
@@ -81,6 +82,7 @@
8182
</Reference>
8283
</ItemGroup>
8384
<ItemGroup>
85+
<Compile Include="AtomFeed\AtomFeedTests.cs" />
8486
<Compile Include="Commandline\NuGetCommandLineTests.cs" />
8587
<Compile Include="Commandline\NuGetCoreTests.cs" />
8688
<Compile Include="ODataFeeds\CuratedFeedTest.cs" />

0 commit comments

Comments
 (0)