Skip to content

Commit 8c7e2d3

Browse files
authored
Merge pull request #1490 from AppFlowy-IO/filter_bloc_test
chore: add filter test
2 parents 039d62c + b6773a7 commit 8c7e2d3

File tree

11 files changed

+241
-40
lines changed

11 files changed

+241
-40
lines changed

frontend/app_flowy/lib/plugins/board/application/card/card_bloc.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ class BoardCardBloc extends Bloc<BoardCardEvent, BoardCardState> {
6666
state.cells.map((cell) => cell.identifier.fieldInfo).toList(),
6767
),
6868
rowPB: state.rowPB,
69-
visible: true,
7069
);
7170
}
7271

frontend/app_flowy/lib/plugins/board/presentation/board_page.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,6 @@ class _BoardContentState extends State<BoardContent> {
287287
gridId: gridId,
288288
fields: UnmodifiableListView(fieldController.fieldInfos),
289289
rowPB: rowPB,
290-
visible: true,
291290
);
292291

293292
final dataController = GridRowDataController(

frontend/app_flowy/lib/plugins/grid/application/row/row_cache.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ class GridRowCache {
3939

4040
UnmodifiableListView<RowInfo> get visibleRows {
4141
var visibleRows = [..._rowList.rows];
42-
visibleRows.retainWhere((element) => element.visible);
4342
return UnmodifiableListView(visibleRows);
4443
}
4544

@@ -236,7 +235,6 @@ class GridRowCache {
236235
gridId: gridId,
237236
fields: _fieldNotifier.fields,
238237
rowPB: rowPB,
239-
visible: true,
240238
);
241239
}
242240
}
@@ -264,7 +262,6 @@ class RowInfo with _$RowInfo {
264262
required String gridId,
265263
required UnmodifiableListView<FieldInfo> fields,
266264
required RowPB rowPB,
267-
required bool visible,
268265
}) = _RowInfo;
269266
}
270267

frontend/app_flowy/test/bloc_test/grid_test/select_option_bloc_test.dart renamed to frontend/app_flowy/test/bloc_test/grid_test/cell/select_option_cell_test.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
66
import 'package:flowy_sdk/protobuf/flowy-grid/select_type_option.pb.dart';
77
import 'package:flutter_test/flutter_test.dart';
88
import 'package:bloc_test/bloc_test.dart';
9-
import 'util.dart';
9+
import '../util.dart';
1010

1111
void main() {
1212
late AppFlowyGridCellTest cellTest;
@@ -19,9 +19,8 @@ void main() {
1919
setUp(() async {
2020
await cellTest.createTestGrid();
2121
await cellTest.createTestRow();
22-
cellController = await cellTest.makeCellController(
23-
FieldType.SingleSelect,
24-
);
22+
cellController =
23+
await cellTest.makeCellController(FieldType.SingleSelect, 0);
2524
});
2625

2726
blocTest<SelectOptionCellEditorBloc, SelectOptionEditorState>(

frontend/app_flowy/test/bloc_test/grid_test/edit_field_edit_test.dart renamed to frontend/app_flowy/test/bloc_test/grid_test/field/edit_field_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:app_flowy/plugins/grid/application/prelude.dart';
33
import 'package:bloc_test/bloc_test.dart';
44
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
55
import 'package:flutter_test/flutter_test.dart';
6-
import 'util.dart';
6+
import '../util.dart';
77

88
Future<FieldEditorBloc> createEditorBloc(AppFlowyGridTest gridTest) async {
99
final context = await gridTest.createTestGrid();

frontend/app_flowy/test/bloc_test/grid_test/create_filter_test.dart renamed to frontend/app_flowy/test/bloc_test/grid_test/filter/create_filter_test.dart

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import 'package:app_flowy/plugins/grid/application/grid_data_controller.dart';
44
import 'package:flowy_sdk/protobuf/flowy-grid/checkbox_filter.pbenum.dart';
55
import 'package:flowy_sdk/protobuf/flowy-grid/text_filter.pb.dart';
66
import 'package:flutter_test/flutter_test.dart';
7-
import 'util.dart';
7+
8+
import '../util.dart';
89

910
void main() {
1011
late AppFlowyGridTest gridTest;
@@ -16,26 +17,27 @@ void main() {
1617
final context = await gridTest.createTestGrid();
1718
final service = FilterFFIService(viewId: context.gridView.id);
1819
final textField = context.textFieldContext();
19-
service.insertTextFilter(
20+
await service.insertTextFilter(
2021
fieldId: textField.id,
2122
condition: TextFilterCondition.TextIsEmpty,
2223
content: "");
2324
await gridResponseFuture();
25+
2426
assert(context.fieldController.filterInfos.length == 1);
2527
});
2628

2729
test('delete a text filter)', () async {
2830
final context = await gridTest.createTestGrid();
2931
final service = FilterFFIService(viewId: context.gridView.id);
3032
final textField = context.textFieldContext();
31-
service.insertTextFilter(
33+
await service.insertTextFilter(
3234
fieldId: textField.id,
3335
condition: TextFilterCondition.TextIsEmpty,
3436
content: "");
3537
await gridResponseFuture();
3638

3739
final filterInfo = context.fieldController.filterInfos.first;
38-
service.deleteFilter(
40+
await service.deleteFilter(
3941
fieldId: textField.id,
4042
filterId: filterInfo.filter.id,
4143
fieldType: textField.fieldType,
@@ -77,13 +79,13 @@ void main() {
7779
await gridResponseFuture();
7880

7981
final textField = context.textFieldContext();
80-
service.insertTextFilter(
82+
await service.insertTextFilter(
8183
fieldId: textField.id,
8284
condition: TextFilterCondition.TextIsEmpty,
8385
content: "");
8486
await gridResponseFuture();
8587

86-
final controller = await context.makeTextCellController();
88+
final controller = await context.makeTextCellController(0);
8789
controller.saveCellData("edit text cell content");
8890
await gridResponseFuture();
8991
assert(gridBloc.state.rowInfos.length == 2);
@@ -98,7 +100,7 @@ void main() {
98100
final service = FilterFFIService(viewId: context.gridView.id);
99101
final textField = context.textFieldContext();
100102
await gridResponseFuture();
101-
service.insertTextFilter(
103+
await service.insertTextFilter(
102104
fieldId: textField.id,
103105
condition: TextFilterCondition.TextIsNotEmpty,
104106
content: "");
@@ -117,7 +119,7 @@ void main() {
117119
)..add(const GridEvent.initial());
118120

119121
await gridResponseFuture();
120-
service.insertCheckboxFilter(
122+
await service.insertCheckboxFilter(
121123
fieldId: checkboxField.id,
122124
condition: CheckboxFilterCondition.IsUnChecked,
123125
);
@@ -136,7 +138,7 @@ void main() {
136138
)..add(const GridEvent.initial());
137139

138140
await gridResponseFuture();
139-
service.insertCheckboxFilter(
141+
await service.insertCheckboxFilter(
140142
fieldId: checkboxField.id,
141143
condition: CheckboxFilterCondition.IsChecked,
142144
);

frontend/app_flowy/test/bloc_test/grid_test/edit_field_change_filter_test.dart renamed to frontend/app_flowy/test/bloc_test/grid_test/filter/edit_filter_field_test.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import 'package:app_flowy/plugins/grid/application/filter/filter_service.dart';
55
import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart';
66
import 'package:flowy_sdk/protobuf/flowy-grid/text_filter.pb.dart';
77
import 'package:flutter_test/flutter_test.dart';
8-
import 'util.dart';
8+
9+
import '../util.dart';
910

1011
void main() {
1112
late AppFlowyGridTest gridTest;
@@ -25,7 +26,7 @@ void main() {
2526
)..add(const GridFilterMenuEvent.initial());
2627

2728
// Insert filter for the text field
28-
service.insertTextFilter(
29+
await service.insertTextFilter(
2930
fieldId: textField.id,
3031
condition: TextFilterCondition.TextIsEmpty,
3132
content: "");
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import 'package:app_flowy/plugins/grid/application/filter/filter_menu_bloc.dart';
2+
import 'package:app_flowy/plugins/grid/application/filter/filter_service.dart';
3+
import 'package:flowy_sdk/protobuf/flowy-grid/text_filter.pb.dart';
4+
import 'package:flutter_test/flutter_test.dart';
5+
6+
import '../util.dart';
7+
8+
void main() {
9+
late AppFlowyGridTest gridTest;
10+
setUpAll(() async {
11+
gridTest = await AppFlowyGridTest.ensureInitialized();
12+
});
13+
14+
test('test filter menu after create a text filter)', () async {
15+
final context = await gridTest.createTestGrid();
16+
final menuBloc = GridFilterMenuBloc(
17+
viewId: context.gridView.id, fieldController: context.fieldController)
18+
..add(const GridFilterMenuEvent.initial());
19+
await gridResponseFuture();
20+
assert(menuBloc.state.creatableFields.length == 1);
21+
22+
final service = FilterFFIService(viewId: context.gridView.id);
23+
final textField = context.textFieldContext();
24+
await service.insertTextFilter(
25+
fieldId: textField.id,
26+
condition: TextFilterCondition.TextIsEmpty,
27+
content: "");
28+
await gridResponseFuture();
29+
assert(menuBloc.state.creatableFields.isEmpty);
30+
});
31+
32+
test('test filter menu after update existing text filter)', () async {
33+
final context = await gridTest.createTestGrid();
34+
final menuBloc = GridFilterMenuBloc(
35+
viewId: context.gridView.id, fieldController: context.fieldController)
36+
..add(const GridFilterMenuEvent.initial());
37+
await gridResponseFuture();
38+
39+
final service = FilterFFIService(viewId: context.gridView.id);
40+
final textField = context.textFieldContext();
41+
42+
// Create filter
43+
await service.insertTextFilter(
44+
fieldId: textField.id,
45+
condition: TextFilterCondition.TextIsEmpty,
46+
content: "");
47+
await gridResponseFuture();
48+
49+
final textFilter = context.fieldController.filterInfos.first;
50+
// Update the existing filter
51+
await service.insertTextFilter(
52+
fieldId: textField.id,
53+
filterId: textFilter.filter.id,
54+
condition: TextFilterCondition.Is,
55+
content: "ABC");
56+
await gridResponseFuture();
57+
assert(menuBloc.state.filters.first.textFilter()!.condition ==
58+
TextFilterCondition.Is);
59+
assert(menuBloc.state.filters.first.textFilter()!.content == "ABC");
60+
});
61+
}
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import 'package:app_flowy/plugins/grid/application/filter/filter_service.dart';
2+
import 'package:flowy_sdk/protobuf/flowy-grid/text_filter.pb.dart';
3+
import 'package:flutter_test/flutter_test.dart';
4+
5+
import '../util.dart';
6+
import 'filter_util.dart';
7+
8+
void main() {
9+
late AppFlowyGridTest gridTest;
10+
setUpAll(() async {
11+
gridTest = await AppFlowyGridTest.ensureInitialized();
12+
});
13+
14+
test('filter rows by text is empty or is not empty condition)', () async {
15+
final context = await createTestFilterGrid(gridTest);
16+
17+
final service = FilterFFIService(viewId: context.gridView.id);
18+
final textField = context.textFieldContext();
19+
// create a new filter
20+
await service.insertTextFilter(
21+
fieldId: textField.id,
22+
condition: TextFilterCondition.TextIsEmpty,
23+
content: "");
24+
await gridResponseFuture();
25+
assert(context.fieldController.filterInfos.length == 1,
26+
"expect 1 but receive ${context.fieldController.filterInfos.length}");
27+
assert(context.rowInfos.length == 1,
28+
"expect 1 but receive ${context.rowInfos.length}");
29+
30+
// Update the existing filter
31+
final textFilter = context.fieldController.filterInfos.first;
32+
await service.insertTextFilter(
33+
fieldId: textField.id,
34+
filterId: textFilter.filter.id,
35+
condition: TextFilterCondition.TextIsNotEmpty,
36+
content: "");
37+
await gridResponseFuture();
38+
assert(context.rowInfos.length == 2);
39+
40+
// delete the filter
41+
await service.deleteFilter(
42+
fieldId: textField.id,
43+
filterId: textFilter.filter.id,
44+
fieldType: textField.fieldType,
45+
);
46+
await gridResponseFuture();
47+
assert(context.rowInfos.length == 3);
48+
});
49+
50+
test('filter rows by text is condition)', () async {
51+
final context = await createTestFilterGrid(gridTest);
52+
53+
final service = FilterFFIService(viewId: context.gridView.id);
54+
final textField = context.textFieldContext();
55+
// create a new filter
56+
await service.insertTextFilter(
57+
fieldId: textField.id, condition: TextFilterCondition.Is, content: "A");
58+
await gridResponseFuture();
59+
assert(context.rowInfos.length == 1,
60+
"expect 1 but receive ${context.rowInfos.length}");
61+
62+
// Update the existing filter's content from 'A' to 'B'
63+
final textFilter = context.fieldController.filterInfos.first;
64+
await service.insertTextFilter(
65+
fieldId: textField.id,
66+
filterId: textFilter.filter.id,
67+
condition: TextFilterCondition.Is,
68+
content: "B");
69+
await gridResponseFuture();
70+
assert(context.rowInfos.length == 1);
71+
72+
// Update the existing filter's content from 'B' to 'b'
73+
await service.insertTextFilter(
74+
fieldId: textField.id,
75+
filterId: textFilter.filter.id,
76+
condition: TextFilterCondition.Is,
77+
content: "b");
78+
await gridResponseFuture();
79+
assert(context.rowInfos.length == 1);
80+
81+
// Update the existing filter with content 'C'
82+
await service.insertTextFilter(
83+
fieldId: textField.id,
84+
filterId: textFilter.filter.id,
85+
condition: TextFilterCondition.Is,
86+
content: "C");
87+
await gridResponseFuture();
88+
assert(context.rowInfos.isEmpty);
89+
90+
// delete the filter
91+
await service.deleteFilter(
92+
fieldId: textField.id,
93+
filterId: textFilter.filter.id,
94+
fieldType: textField.fieldType,
95+
);
96+
await gridResponseFuture();
97+
assert(context.rowInfos.length == 3);
98+
});
99+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import 'package:app_flowy/plugins/grid/application/grid_data_controller.dart';
2+
import 'package:app_flowy/plugins/grid/grid.dart';
3+
import 'package:app_flowy/workspace/application/app/app_service.dart';
4+
5+
import '../util.dart';
6+
7+
Future<GridTestContext> createTestFilterGrid(AppFlowyGridTest gridTest) async {
8+
final app = await gridTest.unitTest.createTestApp();
9+
final builder = GridPluginBuilder();
10+
final context = await AppService()
11+
.createView(
12+
appId: app.id,
13+
name: "Filter Grid",
14+
dataFormatType: builder.dataFormatType,
15+
pluginType: builder.pluginType,
16+
layoutType: builder.layoutType!,
17+
)
18+
.then((result) {
19+
return result.fold(
20+
(view) async {
21+
final context = GridTestContext(view, GridController(view: view));
22+
final result = await context.gridController.openGrid();
23+
24+
await editCells(context);
25+
await gridResponseFuture(milliseconds: 500);
26+
result.fold((l) => null, (r) => throw Exception(r));
27+
return context;
28+
},
29+
(error) => throw Exception(),
30+
);
31+
});
32+
33+
return context;
34+
}
35+
36+
Future<void> editCells(GridTestContext context) async {
37+
final controller0 = await context.makeTextCellController(0);
38+
final controller1 = await context.makeTextCellController(1);
39+
40+
controller0.saveCellData('A');
41+
controller1.saveCellData('B');
42+
}

0 commit comments

Comments
 (0)