diff --git a/frontend/app_flowy/test/bloc_test/grid_test/grid_bloc_test.dart b/frontend/app_flowy/test/bloc_test/grid_test/grid_bloc_test.dart index de7ba7ee9c..b2bfa6996f 100644 --- a/frontend/app_flowy/test/bloc_test/grid_test/grid_bloc_test.dart +++ b/frontend/app_flowy/test/bloc_test/grid_test/grid_bloc_test.dart @@ -27,7 +27,7 @@ void main() { setUpAll(() async { gridBloc = GridBloc(view: gridTest.gridView) ..add(const GridEvent.initial()); - await gridBlocResponseFuture(); + await gridResponseFuture(); }); // The initial number of rows is three @@ -37,7 +37,7 @@ void main() { test('delete row', () async { gridBloc.add(GridEvent.deleteRow(gridBloc.state.rowInfos.last)); - await gridBlocResponseFuture(); + await gridResponseFuture(); assert(gridBloc.state.rowInfos.length == 2); }); }); diff --git a/frontend/app_flowy/test/bloc_test/grid_test/select_option_bloc_test.dart b/frontend/app_flowy/test/bloc_test/grid_test/select_option_bloc_test.dart new file mode 100644 index 0000000000..bea51b4960 --- /dev/null +++ b/frontend/app_flowy/test/bloc_test/grid_test/select_option_bloc_test.dart @@ -0,0 +1,36 @@ +import 'package:app_flowy/plugins/grid/application/cell/cell_service/cell_service.dart'; +import 'package:app_flowy/plugins/grid/application/cell/select_option_editor_bloc.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:bloc_test/bloc_test.dart'; +import 'util.dart'; + +void main() { + late AppFlowyGridSelectOptionCellTest cellTest; + setUpAll(() async { + cellTest = await AppFlowyGridSelectOptionCellTest.ensureInitialized(); + }); + + group('SingleSelectOptionBloc', () { + late GridSelectOptionCellController cellController; + setUp(() async { + cellController = + await cellTest.makeCellController(FieldType.SingleSelect); + }); + + blocTest( + "create option", + build: () { + final bloc = SelectOptionCellEditorBloc(cellController: cellController); + bloc.add(const SelectOptionEditorEvent.initial()); + return bloc; + }, + act: (bloc) => bloc.add(const SelectOptionEditorEvent.newOption("A")), + wait: gridResponseDuration(), + verify: (bloc) { + assert(bloc.state.options.length == 1); + assert(bloc.state.options[0].name == "A"); + }, + ); + }); +} diff --git a/frontend/app_flowy/test/bloc_test/grid_test/util.dart b/frontend/app_flowy/test/bloc_test/grid_test/util.dart index 339fb1c12a..e81028dedc 100644 --- a/frontend/app_flowy/test/bloc_test/grid_test/util.dart +++ b/frontend/app_flowy/test/bloc_test/grid_test/util.dart @@ -1,6 +1,12 @@ +import 'package:app_flowy/plugins/grid/application/cell/cell_service/cell_service.dart'; +import 'package:app_flowy/plugins/grid/application/grid_data_controller.dart'; +import 'package:app_flowy/plugins/grid/application/row/row_bloc.dart'; +import 'package:app_flowy/plugins/grid/application/row/row_cache.dart'; +import 'package:app_flowy/plugins/grid/application/row/row_data_controller.dart'; import 'package:app_flowy/plugins/grid/grid.dart'; import 'package:app_flowy/workspace/application/app/app_service.dart'; import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart'; +import 'package:flowy_sdk/protobuf/flowy-grid/field_entities.pb.dart'; import '../../util.dart'; @@ -35,10 +41,84 @@ class AppFlowyGridTest { } } -Future gridBlocResponseFuture({int millseconds = 100}) { - return Future.delayed(gridBlocResponseDuration(millseconds: millseconds)); +class AppFlowyGridSelectOptionCellTest { + final AppFlowyGridCellTest _cellTest; + + AppFlowyGridSelectOptionCellTest(AppFlowyGridCellTest cellTest) + : _cellTest = cellTest; + + static Future ensureInitialized() async { + final cellTest = await AppFlowyGridCellTest.ensureInitialized(); + final test = AppFlowyGridSelectOptionCellTest(cellTest); + return test; + } + + /// For the moment, just edit the first row of the grid. + Future makeCellController( + FieldType fieldType) async { + assert(fieldType == FieldType.SingleSelect || + fieldType == FieldType.MultiSelect); + + final fieldContexts = + _cellTest._dataController.fieldController.fieldContexts; + final field = + fieldContexts.firstWhere((element) => element.fieldType == fieldType); + final builder = await _cellTest.cellControllerBuilder(0, field.id); + final cellController = builder.build() as GridSelectOptionCellController; + return cellController; + } } -Duration gridBlocResponseDuration({int millseconds = 100}) { - return Duration(milliseconds: millseconds); +class AppFlowyGridCellTest { + // ignore: unused_field + final AppFlowyGridTest _gridTest; + final GridDataController _dataController; + AppFlowyGridCellTest(AppFlowyGridTest gridTest) + : _gridTest = gridTest, + _dataController = GridDataController(view: gridTest.gridView); + + static Future ensureInitialized() async { + final gridTest = await AppFlowyGridTest.ensureInitialized(); + final test = AppFlowyGridCellTest(gridTest); + await test._loadGridData(); + return test; + } + + Future _loadGridData() async { + final result = await _dataController.loadData(); + result.fold((l) => null, (r) => throw Exception(r)); + } + + Future cellControllerBuilder( + int rowIndex, String fieldId) async { + final RowInfo rowInfo = _dataController.rowInfos[rowIndex]; + final blockCache = _dataController.blocks[rowInfo.rowPB.blockId]; + final rowCache = blockCache?.rowCache; + + final rowDataController = GridRowDataController( + rowInfo: rowInfo, + fieldController: _dataController.fieldController, + rowCache: rowCache!, + ); + + final rowBloc = RowBloc( + rowInfo: rowInfo, + dataController: rowDataController, + )..add(const RowEvent.initial()); + await gridResponseFuture(milliseconds: 300); + + return GridCellControllerBuilder( + cellId: rowBloc.state.gridCellMap[fieldId]!, + cellCache: rowCache.cellCache, + delegate: rowDataController, + ); + } +} + +Future gridResponseFuture({int milliseconds = 200}) { + return Future.delayed(gridResponseDuration(milliseconds: milliseconds)); +} + +Duration gridResponseDuration({int milliseconds = 200}) { + return Duration(milliseconds: milliseconds); }