1+ using System ;
2+ using System . Diagnostics ;
3+ using FluentAssertions . Execution ;
4+ using FluentAssertions . Mvc ;
5+ using FluentAssertions . Primitives ;
6+ using Microsoft . AspNetCore . Mvc ;
7+
8+ namespace FluentAssertions . AspNetCore . Mvc
9+ {
10+ /// <summary>
11+ /// Contains a number of methods to assert that a <see cref="ViewResult" /> is in the expected state.
12+ /// </summary>
13+ [ DebuggerNonUserCode ]
14+ public class ViewResultAssertions < T > : ObjectAssertions
15+ where T : ViewResult
16+ {
17+ /// <summary>
18+ /// Initializes a new instance of the <see cref="T:ViewResultAssertions" /> class.
19+ /// </summary>
20+ /// <param name="subject">The object to test assertion on</param>
21+ public ViewResultAssertions ( ViewResult subject ) : base ( subject )
22+ {
23+ }
24+
25+ private ViewResult ViewResultSubject => ( ViewResult ) Subject ;
26+
27+ /// <summary>
28+ /// The model.
29+ /// </summary>
30+ public object Model
31+ {
32+ get
33+ {
34+ var model = ViewResultSubject . Model ;
35+ return model ;
36+ }
37+ }
38+
39+ /// <summary>
40+ /// Asserts that the view name is the expected view name.
41+ /// </summary>
42+ /// <param name="expectedViewName">The view name.</param>
43+ /// <param name="reason">
44+ /// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
45+ /// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
46+ /// </param>
47+ /// <param name="reasonArgs">
48+ /// Zero or more objects to format using the placeholders in <see cref="reason" />.
49+ /// </param>
50+ public ViewResultAssertions < T > WithViewName ( string expectedViewName , string reason = "" ,
51+ params object [ ] reasonArgs )
52+ {
53+ var actualViewName = ViewResultSubject . ViewName ;
54+
55+ Execute . Assertion
56+ . ForCondition ( string . Equals ( expectedViewName , actualViewName , StringComparison . OrdinalIgnoreCase ) )
57+ . BecauseOf ( reason , reasonArgs )
58+ . FailWith ( FailureMessages . ViewResultBase_ViewName , expectedViewName , actualViewName ) ;
59+ return this ;
60+ }
61+
62+ /// <summary>
63+ /// Asserts that the view data contains the expected data.
64+ /// </summary>
65+ /// <param name="key">The expected view data key.</param>
66+ /// <param name="expectedValue">The expected view data.</param>
67+ /// <param name="reason">
68+ /// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
69+ /// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
70+ /// </param>
71+ /// <param name="reasonArgs">
72+ /// Zero or more objects to format using the placeholders in <see cref="reason" />.
73+ /// </param>
74+ public ViewResultAssertions < T > WithViewData ( string key , object expectedValue , string reason = "" ,
75+ params object [ ] reasonArgs )
76+ {
77+ var actualViewData = ViewResultSubject . ViewData ;
78+
79+ Execute . Assertion
80+ . ForCondition ( actualViewData . ContainsKey ( key ) )
81+ . BecauseOf ( reason , reasonArgs )
82+ . FailWith ( FailureMessages . ViewResultBase_ViewData_ContainsKey , key ) ;
83+
84+ var actualValue = actualViewData [ key ] ;
85+
86+ Execute . Assertion
87+ . ForCondition ( actualValue . Equals ( expectedValue ) )
88+ . BecauseOf ( reason , reasonArgs )
89+ . FailWith ( FailureMessages . ViewResultBase_ViewData_HaveValue , key , expectedValue , actualValue ) ;
90+
91+ return this ;
92+ }
93+
94+ /// <summary>
95+ /// Asserts that the temp data contains the expected data.
96+ /// </summary>
97+ /// <param name="key">The expected temp data key.</param>
98+ /// <param name="expectedValue">The expected temp data.</param>
99+ /// <param name="reason">
100+ /// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
101+ /// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
102+ /// </param>
103+ /// <param name="reasonArgs">
104+ /// Zero or more objects to format using the placeholders in <see cref="reason" />.
105+ /// </param>
106+ public ViewResultAssertions < T > WithTempData ( string key , object expectedValue , string reason = "" ,
107+ params object [ ] reasonArgs )
108+ {
109+ var actualTempData = ViewResultSubject . TempData ;
110+
111+ Execute . Assertion
112+ . ForCondition ( actualTempData . ContainsKey ( key ) )
113+ . BecauseOf ( reason , reasonArgs )
114+ . FailWith ( "TempData does not contain key of '{0}'" , key ) ;
115+
116+ actualTempData [ key ] . Should ( ) . Be ( expectedValue ) ;
117+
118+ return this ;
119+ }
120+
121+ /// <summary>
122+ /// Asserts the model is of the expected type.
123+ /// </summary>
124+ /// <typeparam name="TModel">The expected type.</typeparam>
125+ /// <returns>The typed model.</returns>
126+ public TModel ModelAs < TModel > ( )
127+ {
128+ var model = ViewResultSubject . Model ;
129+
130+ if ( model == null )
131+ Execute . Assertion . FailWith ( FailureMessages . ViewResultBase_NullModel , typeof ( TModel ) . Name ) ;
132+
133+ Execute . Assertion
134+ . ForCondition ( model is TModel )
135+ . FailWith ( "Expected Model to be of type '{0}' but was '{1}'" , typeof ( TModel ) . Name , model . GetType ( ) . Name ) ;
136+
137+ return ( TModel ) model ;
138+ }
139+
140+ /// <summary>
141+ /// Asserts that the default view will be used.
142+ /// </summary>
143+ /// <param name="reason">
144+ /// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
145+ /// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
146+ /// </param>
147+ /// <param name="reasonArgs">
148+ /// Zero or more objects to format using the placeholders in <see cref="reason" />.
149+ /// </param>
150+ public ViewResultAssertions < T > WithDefaultViewName ( string reason = "" , params object [ ] reasonArgs )
151+ {
152+ var viewName = ViewResultSubject . ViewName ;
153+
154+ Execute . Assertion
155+ . ForCondition ( viewName == string . Empty )
156+ . BecauseOf ( reason , reasonArgs )
157+ . FailWith ( FailureMessages . ViewResultBase_WithDefaultViewName , viewName ) ;
158+
159+ return this ;
160+ }
161+ }
162+ }
0 commit comments