Skip to content

Commit 0a97d1f

Browse files
committed
test: 增加 NumberFilter 单元测试
1 parent c65affa commit 0a97d1f

File tree

3 files changed

+63
-145
lines changed

3 files changed

+63
-145
lines changed

src/BootstrapBlazor/Components/Filters/NumberFilter.razor

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,20 @@
55
@if (IsHeaderRow)
66
{
77
<div class="@FilterRowClassString">
8-
@if (typeof(TType).IsNumber())
9-
{
10-
<BootstrapInputNumber @bind-Value="@_value1" ShowLabel="false" SkipValidate="true"
11-
OnValueChanged="_ => OnFilterAsync()" Step="@_step"></BootstrapInputNumber>
12-
}
13-
else
14-
{
15-
<BootstrapInput @bind-Value="@_value1" ShowLabel="false" SkipValidate="true"
16-
OnValueChanged="_ => OnFilterAsync()"></BootstrapInput>
17-
}
8+
<BootstrapInputNumber @bind-Value="@_value1" ShowLabel="false" SkipValidate="true"
9+
OnValueChanged="_ => OnFilterAsync()" Step="@_step"></BootstrapInputNumber>
1810
<FilterButton Items="@Items" @bind-Value="@_action1" OnSelectedItemChanged="_ => OnFilterAsync()"
1911
OnClearFilter="OnClearFilter" />
2012
</div>
2113
}
2214
else
2315
{
2416
<Select Items="@Items" @bind-Value="@_action1" ShowLabel="false" SkipValidate="true"></Select>
25-
@if (typeof(TType).IsNumber())
26-
{
27-
<BootstrapInputNumber @bind-Value="@_value1" ShowLabel="false" SkipValidate="true" Step="@_step"></BootstrapInputNumber>
28-
}
29-
else
30-
{
31-
<BootstrapInput @bind-Value="@_value1" ShowLabel="false" SkipValidate="true"></BootstrapInput>
32-
}
17+
<BootstrapInputNumber @bind-Value="@_value1" ShowLabel="false" SkipValidate="true" Step="@_step"></BootstrapInputNumber>
3318
@if (Count > 0)
3419
{
3520
<FilterLogicItem @bind-Logic="Logic"></FilterLogicItem>
3621
<Select Items="@Items" @bind-Value="@_action2" ShowLabel="false" SkipValidate="true"></Select>
37-
@if (typeof(TType).IsNumber())
38-
{
39-
<BootstrapInputNumber @bind-Value="@_value2" ShowLabel="false" SkipValidate="true" Step="@_step"></BootstrapInputNumber>
40-
}
41-
else
42-
{
43-
<BootstrapInput @bind-Value="@_value2" ShowLabel="false" SkipValidate="true"></BootstrapInput>
44-
}
22+
<BootstrapInputNumber @bind-Value="@_value2" ShowLabel="false" SkipValidate="true" Step="@_step"></BootstrapInputNumber>
4523
}
4624
}

src/BootstrapBlazor/Components/Filters/NumberFilter.razor.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
namespace BootstrapBlazor.Components;
77

88
/// <summary>
9-
///
9+
/// NumberFilter 组件
1010
/// </summary>
1111
public partial class NumberFilter<TType>
1212
{
@@ -42,7 +42,7 @@ protected override void OnParametersSet()
4242
new SelectedItem("Equal", Localizer["Equal"].Value),
4343
new SelectedItem("NotEqual", Localizer["NotEqual"].Value)
4444
];
45-
_step = TableColumnFilter.Column.Step;
45+
_step = TableColumnFilter?.Column.Step;
4646
}
4747

4848
/// <summary>
@@ -94,7 +94,7 @@ public override FilterKeyValueAction GetFilterConditions()
9494
/// </summary>
9595
public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
9696
{
97-
var first = filter.Filters?.FirstOrDefault() ?? filter;
97+
var first = filter.Filters.FirstOrDefault() ?? filter;
9898
if (first.FieldValue is TType value)
9999
{
100100
_value1 = value;
@@ -105,7 +105,7 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
105105
}
106106
_action1 = first.FilterAction;
107107

108-
if (filter.Filters is { Count: 2 })
108+
if (filter.Filters.Count > 1)
109109
{
110110
Count = 1;
111111
FilterKeyValueAction second = filter.Filters[1];

test/UnitTest/Components/TableNumberFilterTest.cs

Lines changed: 55 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -8,135 +8,45 @@ namespace UnitTest.Components;
88
public class TableNumberFilterTest : BootstrapBlazorTestBase
99
{
1010
[Fact]
11-
public void Reset_Ok()
12-
{
13-
var cut = Context.RenderComponent<NumberFilter<int>>();
14-
15-
var filter = cut.Instance;
16-
cut.InvokeAsync(() => filter.Reset());
17-
}
18-
19-
[Fact]
20-
public void GetFilterConditions_Ok()
21-
{
22-
var cut = Context.RenderComponent<NumberFilter<int?>>();
23-
24-
var filter = cut.Instance;
25-
var conditions = filter.GetFilterConditions();
26-
Assert.NotNull(conditions.Filters);
27-
Assert.Empty(conditions.Filters);
28-
29-
// Set Value
30-
var dt = cut.FindComponent<BootstrapInputNumber<int?>>();
31-
cut.InvokeAsync(() => dt.Instance.SetValue(10));
32-
conditions = filter.GetFilterConditions();
33-
Assert.NotNull(conditions.Filters);
34-
Assert.Single(conditions.Filters);
35-
}
36-
37-
[Fact]
38-
public async Task Misc_Ok()
39-
{
40-
var cut = Context.RenderComponent<BootstrapBlazorRoot>(pb =>
41-
{
42-
pb.AddChildContent<Table<Foo>>(pb =>
43-
{
44-
pb.Add(a => a.Items, new List<Foo>() { new() });
45-
pb.Add(a => a.RenderMode, TableRenderMode.Table);
46-
pb.Add(a => a.ShowFilterHeader, true);
47-
pb.Add(a => a.TableColumns, new RenderFragment<Foo>(foo => builder =>
48-
{
49-
var index = 0;
50-
builder.OpenComponent<TableColumn<Foo, int>>(index++);
51-
builder.AddAttribute(index++, nameof(TableColumn<Foo, int>.Field), foo.Count);
52-
builder.AddAttribute(index++, nameof(TableColumn<Foo, int>.FieldExpression), foo.GenerateValueExpression(nameof(Foo.Count), typeof(int)));
53-
builder.AddAttribute(index++, nameof(TableColumn<Foo, int>.Filterable), true);
54-
builder.CloseComponent();
55-
}));
56-
});
57-
});
58-
var filter = cut.FindComponent<NumberFilter<int?>>();
59-
var input = filter.FindComponent<BootstrapInputNumber<int?>>();
60-
61-
// Click ToDay Cell
62-
await cut.InvokeAsync(() =>
63-
{
64-
input.Instance.SetValue(10);
65-
});
66-
67-
var filterButton = cut.FindComponent<FilterButton<FilterAction>>();
68-
await cut.InvokeAsync(() =>
69-
{
70-
// OnFilterValueChanged
71-
var logics = filterButton.FindAll(".dropdown-item");
72-
Assert.Equal(6, logics.Count);
73-
74-
logics[1].Click();
75-
});
76-
var conditions = filter.Instance.GetFilterConditions();
77-
Assert.NotNull(conditions.Filters);
78-
Assert.Single(conditions.Filters);
79-
Assert.Equal(10, conditions.Filters[0].FieldValue);
80-
Assert.Equal(FilterAction.LessThanOrEqual, conditions.Filters[0].FilterAction);
81-
82-
// OnClearFilter
83-
await cut.InvokeAsync(() =>
84-
{
85-
filterButton.Find(".fa-ban").Click();
86-
});
87-
conditions = filter.Instance.GetFilterConditions();
88-
Assert.NotNull(conditions.Filters);
89-
Assert.Empty(conditions.Filters);
90-
}
91-
92-
[Fact]
93-
public void NotNumberType_OnFilterValueChanged()
11+
public async Task OnFilterAsync_Ok()
9412
{
9513
var cut = Context.RenderComponent<TableColumnFilter>(pb =>
9614
{
97-
var foo = new Foo();
98-
var column = new TableColumn<Foo, string>();
99-
column.SetParametersAsync(ParameterView.FromDictionary(new Dictionary<string, object?>()
100-
{
101-
[nameof(TableColumn<Foo, string>.Field)] = foo.Name,
102-
[nameof(TableColumn<Foo, string>.FieldExpression)] = foo.GenerateValueExpression(),
103-
[nameof(TableColumn<Foo, string>.FilterTemplate)] = new RenderFragment(builder =>
104-
{
105-
builder.OpenComponent<NumberFilter<string>>(0);
106-
builder.CloseComponent();
107-
})
108-
}));
15+
pb.Add(a => a.Table, new MockTable());
16+
pb.Add(a => a.Column, new MockColumn());
10917
pb.Add(a => a.IsHeaderRow, true);
110-
pb.Add(a => a.Column, column);
11118
});
11219

113-
// InHeaderRow 非数字类型过滤器测试
114-
var input = cut.FindComponent<BootstrapInput<string>>().Instance;
115-
cut.InvokeAsync(() => input.SetValue("10"));
20+
var input = cut.Find("[type=\"number\"]");
21+
await cut.InvokeAsync(() => input.Change("1"));
22+
23+
var action = cut.Find(".dropdown-item");
24+
await cut.InvokeAsync(() => action.Click());
11625
}
11726

11827
[Fact]
119-
public void SetFilterConditions_Ok()
28+
public async Task FilterAction_Ok()
12029
{
121-
var cut = Context.RenderComponent<NumberFilter<int?>>();
30+
var cut = Context.RenderComponent<NumberFilter<double?>>();
12231
var filter = cut.Instance;
123-
var conditions = filter.GetFilterConditions();
124-
Assert.NotNull(conditions.Filters);
125-
Assert.Empty(conditions.Filters);
12632

12733
var newConditions = new FilterKeyValueAction()
12834
{
12935
Filters =
13036
[
131-
new FilterKeyValueAction() { FieldValue = 1 },
132-
new FilterKeyValueAction() { FieldValue = 2 }
37+
new FilterKeyValueAction() { FieldValue = 0.1d },
38+
new FilterKeyValueAction() { FieldValue = 0.2d }
13339
]
13440
};
135-
cut.InvokeAsync(() => filter.SetFilterConditionsAsync(newConditions));
136-
conditions = filter.GetFilterConditions();
137-
Assert.NotNull(conditions.Filters);
41+
await cut.InvokeAsync(() => filter.SetFilterConditionsAsync(newConditions));
42+
var conditions = filter.GetFilterConditions();
13843
Assert.Equal(2, conditions.Filters.Count);
13944

45+
await cut.InvokeAsync(() => filter.Reset());
46+
conditions = filter.GetFilterConditions();
47+
Assert.Empty(conditions.Filters);
48+
49+
// Improve test coverage
14050
newConditions = new FilterKeyValueAction()
14151
{
14252
Filters =
@@ -145,15 +55,45 @@ public void SetFilterConditions_Ok()
14555
new FilterKeyValueAction() { FieldValue = null }
14656
]
14757
};
148-
cut.InvokeAsync(() => filter.SetFilterConditionsAsync(newConditions));
58+
await cut.InvokeAsync(() => filter.SetFilterConditionsAsync(newConditions));
59+
conditions = filter.GetFilterConditions();
60+
Assert.Empty(conditions.Filters);
61+
62+
newConditions = new FilterKeyValueAction()
63+
{
64+
Filters =
65+
[
66+
new FilterKeyValueAction() { FieldValue = true },
67+
new FilterKeyValueAction() { FieldValue = false }
68+
]
69+
};
70+
await cut.InvokeAsync(() => filter.SetFilterConditionsAsync(newConditions));
14971
conditions = filter.GetFilterConditions();
150-
Assert.NotNull(conditions.Filters);
15172
Assert.Empty(conditions.Filters);
15273

153-
newConditions = new FilterKeyValueAction() { FieldValue = 1 };
154-
cut.InvokeAsync(() => filter.SetFilterConditionsAsync(newConditions));
74+
newConditions = new FilterKeyValueAction() { FieldValue = "1" };
75+
await cut.InvokeAsync(() => filter.SetFilterConditionsAsync(newConditions));
15576
conditions = filter.GetFilterConditions();
156-
Assert.NotNull(conditions.Filters);
157-
Assert.Single(conditions.Filters);
77+
Assert.Empty(conditions.Filters);
78+
}
79+
80+
class MockTable : ITable
81+
{
82+
public Dictionary<string, IFilterAction> Filters { get; set; } = [];
83+
84+
public Func<Task>? OnFilterAsync { get; set; }
85+
86+
public List<ITableColumn> Columns => [];
87+
88+
public IEnumerable<ITableColumn> GetVisibleColumns() => Columns;
89+
}
90+
91+
class MockColumn : TableColumn<Foo, double?>
92+
{
93+
public MockColumn()
94+
{
95+
PropertyType = typeof(double?);
96+
FieldName = "Double";
97+
}
15898
}
15999
}

0 commit comments

Comments
 (0)