|
4 | 4 | // Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone |
5 | 5 |
|
6 | 6 | using Microsoft.AspNetCore.Components.Forms; |
| 7 | +using System.ComponentModel.DataAnnotations; |
7 | 8 |
|
8 | 9 | namespace UnitTest.Components; |
9 | 10 |
|
@@ -150,20 +151,77 @@ public void ShowFileSize_Ok() |
150 | 151 | cut.DoesNotContain("upload-item-file-size"); |
151 | 152 | } |
152 | 153 |
|
| 154 | + private class Dummy |
| 155 | + { |
| 156 | + [Required] |
| 157 | + public List<UploadFile>? Files { get; set; } |
| 158 | + } |
| 159 | + |
153 | 160 | [Fact] |
154 | | - public void CardUpload_ValidateForm_Ok() |
| 161 | + public async Task CardUpload_ValidateForm_Ok() |
155 | 162 | { |
156 | | - var foo = new Foo(); |
| 163 | + var invalid = false; |
| 164 | + var foo = new Dummy(); |
157 | 165 | var cut = Context.Render<ValidateForm>(pb => |
158 | 166 | { |
159 | 167 | pb.Add(a => a.Model, foo); |
160 | | - pb.AddChildContent<CardUpload<string>>(pb => |
| 168 | + pb.AddChildContent<CardUpload<List<UploadFile>>>(pb => |
| 169 | + { |
| 170 | + pb.Add(a => a.Accept, "Image"); |
| 171 | + pb.Add(a => a.Value, foo.Files); |
| 172 | + pb.Add(a => a.ValueChanged, EventCallback.Factory.Create<List<UploadFile>?>(this, v => foo.Files = v)); |
| 173 | + pb.Add(a => a.ValueExpression, Utility.GenerateValueExpression(foo, "Files", typeof(List<UploadFile>))); |
| 174 | + pb.Add(a => a.AllowExtensions, [".jpg"]); |
| 175 | + pb.Add(a => a.ShowDeleteButton, true); |
| 176 | + }); |
| 177 | + pb.Add(a => a.OnValidSubmit, context => |
| 178 | + { |
| 179 | + invalid = false; |
| 180 | + return Task.CompletedTask; |
| 181 | + }); |
| 182 | + pb.Add(a => a.OnInvalidSubmit, context => |
161 | 183 | { |
162 | | - pb.Add(a => a.Value, foo.Name); |
163 | | - pb.Add(a => a.ValueExpression, foo.GenerateValueExpression()); |
| 184 | + invalid = true; |
| 185 | + return Task.CompletedTask; |
164 | 186 | }); |
165 | 187 | }); |
166 | | - cut.Contains("form-label"); |
| 188 | + |
| 189 | + // 提交表单 |
| 190 | + var form = cut.Find("form"); |
| 191 | + await cut.InvokeAsync(() => form.Submit()); |
| 192 | + Assert.True(invalid); |
| 193 | + |
| 194 | + var input = cut.FindComponent<InputFile>(); |
| 195 | + await cut.InvokeAsync(async () => |
| 196 | + { |
| 197 | + await input.Instance.OnChange.InvokeAsync(new InputFileChangeEventArgs(new List<MockBrowserFile>() |
| 198 | + { |
| 199 | + new() |
| 200 | + })); |
| 201 | + form.Submit(); |
| 202 | + }); |
| 203 | + Assert.False(invalid); |
| 204 | + |
| 205 | + // 设置 Disabled 取消校验 |
| 206 | + var upload = cut.FindComponent<CardUpload<List<UploadFile>>>(); |
| 207 | + upload.Render(pb => |
| 208 | + { |
| 209 | + pb.Add(a => a.IsDisabled, true); |
| 210 | + }); |
| 211 | + |
| 212 | + Assert.DoesNotContain("is-invalid", upload.Markup); |
| 213 | + |
| 214 | + upload.Render(pb => |
| 215 | + { |
| 216 | + pb.Add(a => a.IsDisabled, false); |
| 217 | + }); |
| 218 | + |
| 219 | + var items = cut.FindAll(".btn-outline-danger"); |
| 220 | + Assert.Single(items); |
| 221 | + await cut.InvokeAsync(() => items[0].Click()); |
| 222 | + |
| 223 | + form = cut.Find("form"); |
| 224 | + await cut.InvokeAsync(() => form.Submit()); |
167 | 225 | } |
168 | 226 |
|
169 | 227 | [Fact] |
|
0 commit comments