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+ }
0 commit comments