Merge pull request #439 from mono-soc-2012/garyb/iconfix
[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                 [Category ("NotWorking")]
119                 public void Column_1 ()
120                 {
121                         var test = new WebTest ("ListView_DynamicControl_04.aspx");
122                         var p = test.Run ();
123
124                         // Fake post-back
125                         var delegates = new PageDelegates ();
126                         delegates.PreRenderComplete = Column_1_OnPreRenderComplete;
127                         test.Invoker = new PageInvoker (delegates);
128                         var fr = new FormRequest (test.Response, "form1");
129 #if TARGET_DOTNET
130                         fr.Controls.Add ("ListView4$ctrl0$editMe");
131                         fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
132 #else
133                         fr.Controls.Add ("ListView4$ctl01$editMe");
134                         fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
135 #endif
136                         test.Request = fr;
137                         p = test.Run ();
138
139                         Assert.IsNotNull (test.Response, "#X1");
140                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
141                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
142                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
143                 }
144
145                 static void Column_1_OnPreRenderComplete (Page p)
146                 {
147                         var lc = p.FindControl ("ListView4") as ListView;
148                         Assert.IsNotNull (lc, "#A1");
149
150                         var dc = lc.FindChild<DynamicControl> ("String_Column");
151                         Assert.IsNotNull (dc, "#B1");
152
153                         var field = dc.FieldTemplate as FieldTemplateUserControl;
154                         Assert.IsNotNull (field, "#C1");
155                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Text_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
156
157                         var dv = field.FindChild<DynamicValidator> ("DynamicValidator1");
158                         Assert.IsNotNull (dv, "#D1");
159                         Assert.AreEqual (dc.Column, dv.Column, "#D1-1");
160                 }
161
162                 [Test]
163                 public void ColumnName ()
164                 {
165                         MetaModel m = Utils.CommonInitialize ();
166                         MetaTable t = m.Tables[TestDataContext.TableBazColumnAttributes];
167                         MetaColumn mc = t.GetColumn ("ColumnNoAttributes");
168
169                         var dv = new PokerDynamicValidator ();
170                         Assert.AreEqual (String.Empty, dv.ColumnName, "#A1");
171
172                         dv.Column = mc;
173                         Assert.AreEqual (mc.Name, dv.ColumnName, "#B1");
174                 }
175
176                 [Test]
177                 [Category ("NotWorking")]
178                 public void ColumnName_1 ()
179                 {
180                         var test = new WebTest ("ListView_DynamicControl_04.aspx");
181                         var p = test.Run ();
182
183                         // Fake post-back
184                         var delegates = new PageDelegates ();
185                         delegates.PreRenderComplete = ColumnName_1_OnPreRenderComplete;
186                         test.Invoker = new PageInvoker (delegates);
187                         var fr = new FormRequest (test.Response, "form1");
188 #if TARGET_DOTNET
189                         fr.Controls.Add ("ListView4$ctrl0$editMe");
190                         fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
191 #else
192                         fr.Controls.Add ("ListView4$ctl01$editMe");
193                         fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
194 #endif
195                         test.Request = fr;
196                         p = test.Run ();
197
198                         Assert.IsNotNull (test.Response, "#X1");
199                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
200                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
201                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
202                 }
203
204                 static void ColumnName_1_OnPreRenderComplete (Page p)
205                 {
206                         var lc = p.FindControl ("ListView4") as ListView;
207                         Assert.IsNotNull (lc, "#A1");
208
209                         var dc = lc.FindChild<DynamicControl> ("String_Column");
210                         Assert.IsNotNull (dc, "#B1");
211
212                         var field = dc.FieldTemplate as FieldTemplateUserControl;
213                         Assert.IsNotNull (field, "#C1");
214                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Text_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
215
216                         var dv = field.FindChild<PokerDynamicValidator> ("DynamicValidator1");
217                         Assert.IsNotNull (dv, "#D1");
218                         Assert.AreEqual (dc.Column.Name, dv.ColumnName, "#D1-1");
219                 }
220
221                 [Test]
222                 public void ControlPropertiesValid ()
223                 {
224                         var dv = new PokerDynamicValidator ();
225
226                         // Nice...:
227                         //
228                         // MonoTests.System.Web.DynamicData.DynamicValidatorTest.ControlPropertiesValid:
229                         // System.NullReferenceException : Object reference not set to an instance of an object.
230                         // at System.Web.DynamicData.DynamicDataExtensions.FindDataSourceControl(Control current)
231                         // at System.Web.DynamicData.DynamicValidator.get_DynamicDataSource()
232                         // at System.Web.DynamicData.DynamicValidator.ControlPropertiesValid()
233                         // at MonoTests.Common.PokerDynamicValidator.CallControlPropertiesValid() in C:\Users\grendel\Documents\Visual Studio 2008\Projects\DynamicDataNunit\DynamicDataNunitTests\Common\PokerDynamicValidator.cs:line 20
234                         // 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
235                         // Assert.IsFalse (dv.CallControlPropertiesValid (), "#A1");
236                 }
237
238                 [Test]
239                 public void ControlPropertiesValid_01 ()
240                 {
241                         var test = new WebTest ("DynamicValidator_01.aspx");
242                         var p = test.Run ();
243                         test.Invoker = PageInvoker.CreateOnLoad (ControlPropertiesValid_01_OnLoad);
244                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
245                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
246                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
247                 }
248
249                 static void ControlPropertiesValid_01_OnLoad (Page p)
250                 {
251                         var dv = p.FindChild<PokerDynamicValidator> ("dynamicValidator1");
252                         Assert.IsNotNull (dv, "#A1");
253
254                         Assert.IsFalse (dv.CallControlPropertiesValid (), "#A2");
255                         Assert.IsNull (dv.Column, "#A2-1");
256                         Assert.IsNull (dv.ColumnName, "#A2-2");
257
258                         MetaModel m = Utils.CommonInitialize ();
259                         MetaTable t = m.Tables[TestDataContext.TableBar];
260                         MetaColumn mc = t.GetColumn ("Column1");
261
262                         dv.Column = mc;
263                         Assert.IsFalse (dv.CallControlPropertiesValid (), "#A3");
264                         Assert.IsNotNull (dv.Column, "#A3-1");
265                         Assert.IsNull (dv.ColumnName, "#A3-2");
266                 }
267
268                 [Test]
269                 [Category ("NotWorking")]
270                 public void ControlPropertiesValid_2 ()
271                 {
272                         var test = new WebTest ("ListView_DynamicControl_04.aspx");
273                         var p = test.Run ();
274
275                         // Fake post-back
276                         var delegates = new PageDelegates ();
277                         delegates.PreRenderComplete = ControlPropertiesValid_2_OnPreRenderComplete;
278                         test.Invoker = new PageInvoker (delegates);
279                         var fr = new FormRequest (test.Response, "form1");
280 #if TARGET_DOTNET
281                         fr.Controls.Add ("ListView4$ctrl0$editMe");
282                         fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
283 #else
284                         fr.Controls.Add ("ListView4$ctl01$editMe");
285                         fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
286 #endif
287                         test.Request = fr;
288                         p = test.Run ();
289
290                         Assert.IsNotNull (test.Response, "#X1");
291                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
292                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
293                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
294                 }
295
296                 static void ControlPropertiesValid_2_OnPreRenderComplete (Page p)
297                 {
298                         var lc = p.FindControl ("ListView4") as ListView;
299                         Assert.IsNotNull (lc, "#A1");
300
301                         var dc = lc.FindChild<DynamicControl> ("String_Column");
302                         Assert.IsNotNull (dc, "#B1");
303
304                         var field = dc.FieldTemplate as FieldTemplateUserControl;
305                         Assert.IsNotNull (field, "#C1");
306                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Text_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
307
308                         var dv = field.FindChild<PokerDynamicValidator> ("DynamicValidator1");
309                         Assert.IsNotNull (dv, "#D1");
310                         Assert.IsTrue (dv.CallControlPropertiesValid (), "#D1-2");
311                         Assert.IsNotNull (dv.Column, "#D1-3");
312                         Assert.IsNotNull (dv.ColumnName, "#D1-4");
313                 }
314
315                 [Test]
316                 public void EvaluateIsValid ()
317                 {
318                         var dv = new PokerDynamicValidator ();
319
320                         Assert.IsTrue (dv.CallEvaluateIsValid (), "#A1");
321                         Assert.IsNotNull (dv.ControlToValidate, "#A1-1");
322                         Assert.AreEqual (String.Empty, dv.ControlToValidate, "#A1-2");
323                         Assert.AreEqual (String.Empty, dv.ErrorMessage, "#A1-3");
324
325                         dv.SetValidationException (new Exception ("test message"));
326                         Assert.IsFalse (dv.CallEvaluateIsValid (), "#A2");
327                         Assert.AreEqual (dv.GetValidationException ().Message, dv.ErrorMessage, "#A2-1");
328
329                         dv.SetValidationException (new Exception ("<script>message</script>"));
330                         Assert.IsFalse (dv.CallEvaluateIsValid (), "#A3");
331                         Assert.AreEqual (HttpUtility.HtmlEncode (dv.GetValidationException ().Message), dv.ErrorMessage, "#A3-1");
332                 }
333
334                 [Test]
335                 [Category ("NotWorking")]
336                 public void EvaluateIsValid_1 ()
337                 {
338                         var test = new WebTest ("DynamicValidator_02.aspx");
339                         var p = test.Run ();
340
341                         // Fake post-back
342                         var delegates = new PageDelegates ();
343                         delegates.PreRenderComplete = EvaluateIsValid_1_OnPreRenderComplete;
344                         test.Invoker = new PageInvoker (delegates);
345                         var fr = new FormRequest (test.Response, "form1");
346 #if TARGET_DOTNET
347                         fr.Controls.Add ("ListView1$ctrl0$editMe");
348                         fr.Controls["ListView1$ctrl0$editMe"].Value = "Edit";
349 #else
350                         fr.Controls.Add ("ListView1$ctl01$editMe");
351                         fr.Controls["ListView1$ctl01$editMe"].Value = "Edit";
352 #endif
353                         test.Request = fr;
354                         p = test.Run ();
355
356                         Assert.IsNotNull (test.Response, "#X1");
357                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
358                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
359                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
360                 }
361
362                 static void EvaluateIsValid_1_OnPreRenderComplete (Page p)
363                 {
364                         var lc = p.FindControl ("ListView1") as ListView;
365                         Assert.IsNotNull (lc, "#A1");
366
367                         var dc = lc.FindChild<PokerDynamicControl> ("Column1");
368                         Assert.IsNotNull (dc, "#B1");
369
370                         var field = dc.FieldTemplate as FieldTemplateUserControl;
371                         Assert.IsNotNull (field, "#C1");
372                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Integer_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
373
374                         var dv = field.FindChild<PokerDynamicValidator> ("DynamicValidator1");
375                         Assert.IsNotNull (dv, "#D1");
376
377                         var tb = field.FindChild<TextBox> ("TextBox1");
378                         Assert.IsNotNull (tb, "#D1-2");
379                         Assert.AreEqual ("0", tb.Text, "#D1-3");
380
381                         Assert.IsTrue (dv.CallEvaluateIsValid (), "#E1");
382                 }
383
384                 [Test]
385                 public void ValidationException ()
386                 {
387                         var dv = new PokerDynamicValidator ();
388
389                         Assert.IsNull (dv.GetValidationException (), "#A1");
390
391                         Exception ex = new Exception ();
392                         dv.SetValidationException (ex);
393                         Assert.AreEqual (ex, dv.GetValidationException (), "#B1");
394
395                         ex = new ArgumentNullException ();
396                         dv.SetValidationException (ex);
397                         Assert.AreEqual (ex, dv.GetValidationException (), "#C1");
398
399                         dv.SetValidationException (null);
400                         Assert.IsNull (dv.GetValidationException (), "#D1");
401                 }
402
403                 [Test]
404                 public void ValidationException_1 ()
405                 {
406                         var test = new WebTest ("ListView_DynamicControl_04.aspx");
407                         var p = test.Run ();
408
409                         // Fake post-back
410                         var delegates = new PageDelegates ();
411                         delegates.PreRenderComplete = ValidationException_1_OnPreRenderComplete;
412                         test.Invoker = new PageInvoker (delegates);
413                         var fr = new FormRequest (test.Response, "form1");
414 #if TARGET_DOTNET
415                         fr.Controls.Add ("ListView4$ctrl0$editMe");
416                         fr.Controls["ListView4$ctrl0$editMe"].Value = "Edit";
417 #else
418                         fr.Controls.Add ("ListView4$ctl01$editMe");
419                         fr.Controls["ListView4$ctl01$editMe"].Value = "Edit";
420 #endif
421                         test.Request = fr;
422                         p = test.Run ();
423
424                         Assert.IsNotNull (test.Response, "#X1");
425                         Assert.AreNotEqual (HttpStatusCode.NotFound, test.Response.StatusCode, "#X1-1{0}Returned HTML:{0}{1}", Environment.NewLine, p);
426                         Assert.AreNotEqual (HttpStatusCode.InternalServerError, test.Response.StatusCode, "#X1-2{0}Returned HTML:{0}{1}", Environment.NewLine, p);
427                         Assert.IsFalse (String.IsNullOrEmpty (p), "#X1-3");
428                 }
429
430                 static void ValidationException_1_OnPreRenderComplete (Page p)
431                 {
432                         var lc = p.FindControl ("ListView4") as ListView;
433                         Assert.IsNotNull (lc, "#A1");
434
435                         var dc = lc.FindChild<DynamicControl> ("String_Column");
436                         Assert.IsNotNull (dc, "#B1");
437
438                         var field = dc.FieldTemplate as FieldTemplateUserControl;
439                         Assert.IsNotNull (field, "#C1");
440                         Assert.AreEqual ("~/DynamicData/FieldTemplates/Text_Edit.ascx", field.AppRelativeVirtualPath, "#C1-1");
441
442                         var dv = field.FindChild<PokerDynamicValidator> ("DynamicValidator1");
443                         Assert.IsNotNull (dv, "#D1");
444                         Assert.IsNull (dv.GetValidationException (), "#D1-1");
445
446                         Exception ex = new Exception ();
447                         dv.SetValidationException (ex);
448                         Assert.AreEqual (ex, dv.GetValidationException (), "#E1");
449
450                         ex = new ArgumentNullException ();
451                         dv.SetValidationException (ex);
452                         Assert.AreEqual (ex, dv.GetValidationException (), "#F1");
453
454                         dv.SetValidationException (null);
455                         Assert.IsNull (dv.GetValidationException (), "#G1");
456                 }
457
458                 [Test]
459                 [Category ("NotWorking")]
460                 public void ValidateException ()
461                 {
462                         var dv = new PokerDynamicValidator ();
463
464                         dv.CallValidateException (null);
465
466                         Assert.IsNull (dv.GetValidationException (), "#A1");
467                         Exception ex = new Exception ();
468                         dv.CallValidateException (ex);
469                         Assert.IsNull (dv.GetValidationException (), "#B1");
470
471                         ex = new ValidationException ("test message");
472                         dv.CallValidateException (ex);
473                         Assert.IsNotNull (dv.GetValidationException (), "#C1");
474                         Assert.AreEqual (ex, dv.GetValidationException (), "#C1-1");
475                         Assert.AreEqual ("test message", dv.GetValidationException ().Message, "#C1-2");
476                 }
477         }
478 }