BindingFlags.Public needed here as Exception.HResult is now public in .NET 4.5. This...
[mono.git] / mcs / class / System.Web.DynamicData / Test / System.Web.DynamicData / DynamicValidatorTest.cs
1 //
2 // DynamicValidatorTest.cs
3 //
4 // Authors:
5 //      Marek Habersack <mhabersack@novell.com>
6 //
7 // Copyright (C) 2009 Novell Inc. http://novell.com
8 //
9
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining
12 // a copy of this software and associated documentation files (the
13 // "Software"), to deal in the Software without restriction, including
14 // without limitation the rights to use, copy, modify, merge, publish,
15 // distribute, sublicense, and/or sell copies of the Software, and to
16 // permit persons to whom the Software is furnished to do so, subject to
17 // the following conditions:
18 // 
19 // The above copyright notice and this permission notice shall be
20 // included in all copies or substantial portions of the Software.
21 // 
22 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
24 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
26 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
27 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 //
30 using System;
31 using System.Collections;
32 using System.Collections.Generic;
33 using System.Collections.ObjectModel;
34 using System.Collections.Specialized;
35 using System.ComponentModel.DataAnnotations;
36 using System.Data.SqlClient;
37 using System.Data.Linq;
38 using System.Data.Linq.Mapping;
39 using System.Globalization;
40 using System.Linq;
41 using System.Net;
42 using System.Reflection;
43 using System.Security.Permissions;
44 using System.Security.Principal;
45 using System.Web;
46 using System.Web.UI;
47 using System.Web.DynamicData;
48 using System.Web.DynamicData.ModelProviders;
49 using System.Web.Routing;
50 using System.Web.UI.HtmlControls;
51 using System.Web.UI.WebControls;
52 using System.IO;
53
54 using NUnit.Framework;
55 using NUnit.Mocks;
56 using MonoTests.stand_alone.WebHarness;
57 using MonoTests.SystemWeb.Framework;
58 using MonoTests.Common;
59 using MonoTests.DataSource;
60 using MonoTests.DataObjects;
61 using MonoTests.ModelProviders;
62
63 using MetaModel = System.Web.DynamicData.MetaModel;
64 using MetaTable = System.Web.DynamicData.MetaTable;
65
66 namespace MonoTests.System.Web.DynamicData
67 {
68         [TestFixture]
69         public class DynamicValidatorTest
70         {
71                 DynamicDataContainerModelProvider<TestDataContext> dynamicModelProvider;
72
73                 [TestFixtureSetUp]
74                 public void SetUp ()
75                 {
76                         Type type = GetType ();
77                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx", "ListView_DynamicControl_04.aspx");
78                         WebTest.CopyResource (type, "MonoTests.WebPages.ListView_DynamicControl_04.aspx.cs", "ListView_DynamicControl_04.aspx.cs");
79                         WebTest.CopyResource (type, "MonoTests.WebPages.DynamicValidator_01.aspx", "DynamicValidator_01.aspx");
80                         WebTest.CopyResource (type, "MonoTests.WebPages.DynamicValidator_01.aspx.cs", "DynamicValidator_01.aspx.cs");
81                         WebTest.CopyResource (type, "MonoTests.WebPages.DynamicValidator_02.aspx", "DynamicValidator_02.aspx");
82                         WebTest.CopyResource (type, "MonoTests.WebPages.DynamicValidator_02.aspx.cs", "DynamicValidator_02.aspx.cs");
83
84                         dynamicModelProvider = new DynamicDataContainerModelProvider<TestDataContext> ();
85                         Utils.RegisterContext (dynamicModelProvider, new ContextConfiguration () { ScaffoldAllTables = true });
86                 }
87
88                 [Test]
89                 public void Defaults ()
90                 {
91                         var dv = new PokerDynamicValidator ();
92
93                         Assert.IsNull (dv.Column, "#A1");
94                         Assert.IsNotNull (dv.ColumnName, "#A2");
95                         Assert.AreEqual (String.Empty, dv.ColumnName, "#A2-1");
96                         Assert.IsNull (dv.GetValidationException (), "#A3");
97                 }
98
99                 [Test]
100                 public void Column ()
101                 {
102                         MetaModel m = Utils.CommonInitialize ();
103                         MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes];
104                         MetaColumn mc = t.GetColumn ("ColumnNoAttributes");
105
106                         var dv = new PokerDynamicValidator ();
107                         Assert.IsNull (dv.Column, "#A1");
108
109                         dv.Column = mc;
110                         Assert.IsNotNull (dv.Column, "#B1");
111                         Assert.AreEqual (mc, dv.Column, "#B1-1");
112
113                         dv.Column = null;
114                         Assert.IsNull (dv.Column, "#C1");
115                 }
116
117                 [Test]
118                 public void Column_1 ()
119                 {
120                         var test = new WebTest ("ListView_DynamicControl_04.aspx");
121                         var p = test.Run ();
122
123                         // Fake post-back
124                         var delegates = new PageDelegates ();
125                         delegates.PreRenderComplete = Column_1_OnPreRenderComplete;
126                         test.Invoker = new PageInvoker (delegates);
127                         var fr = new FormRequest (test.Response, "form1");
128 #if TARGET_DOTNET
129                         fr.Controls.Add ("ListView4$ctrl0$editMe");
130                         fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
131 #else
132                         fr.Controls.Add ("ListView4$ctl01$editMe");
133                         fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
134 #endif
135                         test.Request = fr;
136                         p = test.Run ();
137
138                         Assert.IsNotNull (test.Response, "#X1");
139                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
140                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
141                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
142                 }
143
144                 static void Column_1_OnPreRenderComplete (Page p)
145                 {
146                         var lc = p.FindControl ("ListView4") as ListView;
147                         Assert.IsNotNull (lc, "#A1");
148
149                         var dc = lc.FindChild<DynamicControl> ("String_Column");
150                         Assert.IsNotNull (dc, "#B1");
151
152                         var field = dc.FieldTemplate as FieldTemplateUserControl;
153                         Assert.IsNotNull (field, "#C1");
154                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Text_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
155
156                         var dv = field.FindChild<DynamicValidator> ("DynamicValidator1");
157                         Assert.IsNotNull (dv, "#D1");
158                         Assert.AreEqual (dc.Column, dv.Column, "#D1-1");
159                 }
160
161                 [Test]
162                 public void ColumnName ()
163                 {
164                         MetaModel m = Utils.CommonInitialize ();
165                         MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes];
166                         MetaColumn mc = t.GetColumn ("ColumnNoAttributes");
167
168                         var dv = new PokerDynamicValidator ();
169                         Assert.AreEqual (String.Empty, dv.ColumnName, "#A1");
170
171                         dv.Column = mc;
172                         Assert.AreEqual (mc.Name, dv.ColumnName, "#B1");
173                 }
174
175                 [Test]
176                 public void ColumnName_1 ()
177                 {
178                         var test = new WebTest ("ListView_DynamicControl_04.aspx");
179                         var p = test.Run ();
180
181                         // Fake post-back
182                         var delegates = new PageDelegates ();
183                         delegates.PreRenderComplete = ColumnName_1_OnPreRenderComplete;
184                         test.Invoker = new PageInvoker (delegates);
185                         var fr = new FormRequest (test.Response, "form1");
186 #if TARGET_DOTNET
187                         fr.Controls.Add ("ListView4$ctrl0$editMe");
188                         fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
189 #else
190                         fr.Controls.Add ("ListView4$ctl01$editMe");
191                         fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
192 #endif
193                         test.Request = fr;
194                         p = test.Run ();
195
196                         Assert.IsNotNull (test.Response, "#X1");
197                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
198                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
199                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
200                 }
201
202                 static void ColumnName_1_OnPreRenderComplete (Page p)
203                 {
204                         var lc = p.FindControl ("ListView4") as ListView;
205                         Assert.IsNotNull (lc, "#A1");
206
207                         var dc = lc.FindChild<DynamicControl> ("String_Column");
208                         Assert.IsNotNull (dc, "#B1");
209
210                         var field = dc.FieldTemplate as FieldTemplateUserControl;
211                         Assert.IsNotNull (field, "#C1");
212                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Text_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
213
214                         var dv = field.FindChild<PokerDynamicValidator> ("DynamicValidator1");
215                         Assert.IsNotNull (dv, "#D1");
216                         Assert.AreEqual (dc.Column.Name, dv.ColumnName, "#D1-1");
217                 }
218
219                 [Test]
220                 public void ControlPropertiesValid ()
221                 {
222                         var dv = new PokerDynamicValidator ();
223
224                         // Nice...:
225                         //
226                         // MonoTests.System.Web.DynamicData.DynamicValidatorTest.ControlPropertiesValid:
227                         // System.NullReferenceException : Object reference not set to an instance of an object.
228                         // at System.Web.DynamicData.DynamicDataExtensions.FindDataSourceControl(Control current)
229                         // at System.Web.DynamicData.DynamicValidator.get_DynamicDataSource()
230                         // at System.Web.DynamicData.DynamicValidator.ControlPropertiesValid()
231                         // at MonoTests.Common.PokerDynamicValidator.CallControlPropertiesValid() in C:\Users\grendel\Documents\Visual Studio 2008\Projects\DynamicDataNunit\DynamicDataNunitTests\Common\PokerDynamicValidator.cs:line 20
232                         // at MonoTests.System.Web.DynamicData.DynamicValidatorTest.ControlPropertiesValid() in C:\Users\grendel\Documents\Visual Studio 2008\Projects\DynamicDataNunit\DynamicDataNunitTests\System.Web.DynamicData\DynamicValidatorTest.cs:line 220
233                         // Assert.IsFalse (dv.CallControlPropertiesValid (), "#A1");
234                 }
235
236                 [Test]
237                 public void ControlPropertiesValid_01 ()
238                 {
239                         var test = new WebTest ("DynamicValidator_01.aspx");
240                         var p = test.Run ();
241                         test.Invoker = PageInvoker.CreateOnLoad (ControlPropertiesValid_01_OnLoad);
242                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
243                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
244                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
245                 }
246
247                 static void ControlPropertiesValid_01_OnLoad (Page p)
248                 {
249                         var dv = p.FindChild<PokerDynamicValidator> ("dynamicValidator1");
250                         Assert.IsNotNull (dv, "#A1");
251
252                         Assert.IsFalse (dv.CallControlPropertiesValid (), "#A2");
253                         Assert.IsNull (dv.Column, "#A2-1");
254                         Assert.IsNull (dv.ColumnName, "#A2-2");
255
256                         MetaModel m = Utils.CommonInitialize ();
257                         MetaTable t = m.Tables[TestDataContext.TableBar];
258                         MetaColumn mc = t.GetColumn ("Column1");
259
260                         dv.Column = mc;
261                         Assert.IsFalse (dv.CallControlPropertiesValid (), "#A3");
262                         Assert.IsNotNull (dv.Column, "#A3-1");
263                         Assert.IsNull (dv.ColumnName, "#A3-2");
264                 }
265
266                 [Test]
267                 public void ControlPropertiesValid_2 ()
268                 {
269                         var test = new WebTest ("ListView_DynamicControl_04.aspx");
270                         var p = test.Run ();
271
272                         // Fake post-back
273                         var delegates = new PageDelegates ();
274                         delegates.PreRenderComplete = ControlPropertiesValid_2_OnPreRenderComplete;
275                         test.Invoker = new PageInvoker (delegates);
276                         var fr = new FormRequest (test.Response, "form1");
277 #if TARGET_DOTNET
278                         fr.Controls.Add ("ListView4$ctrl0$editMe");
279                         fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
280 #else
281                         fr.Controls.Add ("ListView4$ctl01$editMe");
282                         fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
283 #endif
284                         test.Request = fr;
285                         p = test.Run ();
286
287                         Assert.IsNotNull (test.Response, "#X1");
288                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
289                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
290                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
291                 }
292
293                 static void ControlPropertiesValid_2_OnPreRenderComplete (Page p)
294                 {
295                         var lc = p.FindControl ("ListView4") as ListView;
296                         Assert.IsNotNull (lc, "#A1");
297
298                         var dc = lc.FindChild<DynamicControl> ("String_Column");
299                         Assert.IsNotNull (dc, "#B1");
300
301                         var field = dc.FieldTemplate as FieldTemplateUserControl;
302                         Assert.IsNotNull (field, "#C1");
303                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Text_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
304
305                         var dv = field.FindChild<PokerDynamicValidator> ("DynamicValidator1");
306                         Assert.IsNotNull (dv, "#D1");
307                         Assert.IsTrue (dv.CallControlPropertiesValid (), "#D1-2");
308                         Assert.IsNotNull (dv.Column, "#D1-3");
309                         Assert.IsNotNull (dv.ColumnName, "#D1-4");
310                 }
311
312                 [Test]
313                 public void EvaluateIsValid ()
314                 {
315                         var dv = new PokerDynamicValidator ();
316
317                         Assert.IsTrue (dv.CallEvaluateIsValid (), "#A1");
318                         Assert.IsNotNull (dv.ControlToValidate, "#A1-1");
319                         Assert.AreEqual (String.Empty, dv.ControlToValidate, "#A1-2");
320                         Assert.AreEqual (String.Empty, dv.ErrorMessage, "#A1-3");
321
322                         dv.SetValidationException (new Exception ("test message"));
323                         Assert.IsFalse (dv.CallEvaluateIsValid (), "#A2");
324                         Assert.AreEqual (dv.GetValidationException ().Message, dv.ErrorMessage, "#A2-1");
325
326                         dv.SetValidationException (new Exception ("<script>message</script>"));
327                         Assert.IsFalse (dv.CallEvaluateIsValid (), "#A3");
328                         Assert.AreEqual (HttpUtility.HtmlEncode (dv.GetValidationException ().Message), dv.ErrorMessage, "#A3-1");
329                 }
330
331                 [Test]
332                 public void EvaluateIsValid_1 ()
333                 {
334                         var test = new WebTest ("DynamicValidator_02.aspx");
335                         var p = test.Run ();
336
337                         // Fake post-back
338                         var delegates = new PageDelegates ();
339                         delegates.PreRenderComplete = EvaluateIsValid_1_OnPreRenderComplete;
340                         test.Invoker = new PageInvoker (delegates);
341                         var fr = new FormRequest (test.Response, "form1");
342 #if TARGET_DOTNET
343                         fr.Controls.Add ("ListView1$ctrl0$editMe");
344                         fr.Controls["ListView1$ctrl0$editMe"].Value = "Edit";
345 #else
346                         fr.Controls.Add ("ListView1$ctl01$editMe");
347                         fr.Controls["ListView1$ctl01$editMe"].Value = "Edit";
348 #endif
349                         test.Request = fr;
350                         p = test.Run ();
351
352                         Assert.IsNotNull (test.Response, "#X1");
353                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
354                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
355                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
356                 }
357
358                 static void EvaluateIsValid_1_OnPreRenderComplete (Page p)
359                 {
360                         var lc = p.FindControl ("ListView1") as ListView;
361                         Assert.IsNotNull (lc, "#A1");
362
363                         var dc = lc.FindChild<PokerDynamicControl> ("Column1");
364                         Assert.IsNotNull (dc, "#B1");
365
366                         var field = dc.FieldTemplate as FieldTemplateUserControl;
367                         Assert.IsNotNull (field, "#C1");
368                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Integer_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
369
370                         var dv = field.FindChild<PokerDynamicValidator> ("DynamicValidator1");
371                         Assert.IsNotNull (dv, "#D1");
372
373                         var tb = field.FindChild<TextBox> ("TextBox1");
374                         Assert.IsNotNull (tb, "#D1-2");
375                         Assert.AreEqual ("0", tb.Text, "#D1-3");
376
377                         Assert.IsTrue (dv.CallEvaluateIsValid (), "#E1");
378                 }
379
380                 [Test]
381                 public void ValidationException ()
382                 {
383                         var dv = new PokerDynamicValidator ();
384
385                         Assert.IsNull (dv.GetValidationException (), "#A1");
386
387                         Exception ex = new Exception ();
388                         dv.SetValidationException (ex);
389                         Assert.AreEqual (ex, dv.GetValidationException (), "#B1");
390
391                         ex = new ArgumentNullException ();
392                         dv.SetValidationException (ex);
393                         Assert.AreEqual (ex, dv.GetValidationException (), "#C1");
394
395                         dv.SetValidationException (null);
396                         Assert.IsNull (dv.GetValidationException (), "#D1");
397                 }
398
399                 [Test]
400                 public void ValidationException_1 ()
401                 {
402                         var test = new WebTest ("ListView_DynamicControl_04.aspx");
403                         var p = test.Run ();
404
405                         // Fake post-back
406                         var delegates = new PageDelegates ();
407                         delegates.PreRenderComplete = ValidationException_1_OnPreRenderComplete;
408                         test.Invoker = new PageInvoker (delegates);
409                         var fr = new FormRequest (test.Response, "form1");
410 #if TARGET_DOTNET
411                         fr.Controls.Add ("ListView4$ctrl0$editMe");
412                         fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
413 #else
414                         fr.Controls.Add ("ListView4$ctl01$editMe");
415                         fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
416 #endif
417                         test.Request = fr;
418                         p = test.Run ();
419
420                         Assert.IsNotNull (test.Response, "#X1");
421                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
422                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
423                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
424                 }
425
426                 static void ValidationException_1_OnPreRenderComplete (Page p)
427                 {
428                         var lc = p.FindControl ("ListView4") as ListView;
429                         Assert.IsNotNull (lc, "#A1");
430
431                         var dc = lc.FindChild<DynamicControl> ("String_Column");
432                         Assert.IsNotNull (dc, "#B1");
433
434                         var field = dc.FieldTemplate as FieldTemplateUserControl;
435                         Assert.IsNotNull (field, "#C1");
436                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Text_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
437
438                         var dv = field.FindChild<PokerDynamicValidator> ("DynamicValidator1");
439                         Assert.IsNotNull (dv, "#D1");
440                         Assert.IsNull (dv.GetValidationException (), "#D1-1");
441
442                         Exception ex = new Exception ();
443                         dv.SetValidationException (ex);
444                         Assert.AreEqual (ex, dv.GetValidationException (), "#E1");
445
446                         ex = new ArgumentNullException ();
447                         dv.SetValidationException (ex);
448                         Assert.AreEqual (ex, dv.GetValidationException (), "#F1");
449
450                         dv.SetValidationException (null);
451                         Assert.IsNull (dv.GetValidationException (), "#G1");
452                 }
453
454                 [Test]
455                 public void ValidateException ()
456                 {
457                         var dv = new PokerDynamicValidator ();
458
459                         dv.CallValidateException (null);
460
461                         Assert.IsNull (dv.GetValidationException (), "#A1");
462                         Exception ex = new Exception ();
463                         dv.CallValidateException (ex);
464                         Assert.IsNull (dv.GetValidationException (), "#B1");
465
466                         ex = new ValidationException ("test message");
467                         dv.CallValidateException (ex);
468                         Assert.IsNotNull (dv.GetValidationException (), "#C1");
469                         Assert.AreEqual (ex, dv.GetValidationException (), "#C1-1");
470                         Assert.AreEqual ("test message", dv.GetValidationException ().Message, "#C1-2");
471                 }
472         }
473 }