diff --git a/playground/frontend/lib/modules/editor/repository/code_repository/code_client/code_client.dart b/playground/frontend/lib/modules/editor/repository/code_repository/code_client/code_client.dart index 3a1868ec1b7c..bbf6c82fb7ff 100644 --- a/playground/frontend/lib/modules/editor/repository/code_repository/code_client/code_client.dart +++ b/playground/frontend/lib/modules/editor/repository/code_repository/code_client/code_client.dart @@ -50,4 +50,14 @@ abstract class CodeClient { String pipelineUuid, RunCodeRequestWrapper request, ); + + Future getValidationErrorOutput( + String pipelineUuid, + RunCodeRequestWrapper request, + ); + + Future getPreparationErrorOutput( + String pipelineUuid, + RunCodeRequestWrapper request, + ); } diff --git a/playground/frontend/lib/modules/editor/repository/code_repository/code_client/grpc_code_client.dart b/playground/frontend/lib/modules/editor/repository/code_repository/code_client/grpc_code_client.dart index 9f5047d3de97..b1113bfd9947 100644 --- a/playground/frontend/lib/modules/editor/repository/code_repository/code_client/grpc_code_client.dart +++ b/playground/frontend/lib/modules/editor/repository/code_repository/code_client/grpc_code_client.dart @@ -118,6 +118,28 @@ class GrpcCodeClient implements CodeClient { .then((response) => _toOutputResponse(response.output))); } + @override + Future getValidationErrorOutput( + String pipelineUuid, + RunCodeRequestWrapper request, + ) { + return _runSafely(() => _defaultClient + .getValidationOutput( + grpc.GetValidationOutputRequest(pipelineUuid: pipelineUuid)) + .then((response) => _toOutputResponse(response.output))); + } + + @override + Future getPreparationErrorOutput( + String pipelineUuid, + RunCodeRequestWrapper request, + ) { + return _runSafely(() => _defaultClient + .getPreparationOutput( + grpc.GetPreparationOutputRequest(pipelineUuid: pipelineUuid)) + .then((response) => _toOutputResponse(response.output))); + } + Future _runSafely(Future Function() invoke) async { try { return await invoke(); @@ -182,9 +204,11 @@ class GrpcCodeClient implements CodeClient { return RunCodeStatus.timeout; case grpc.Status.STATUS_RUN_ERROR: return RunCodeStatus.runError; - case grpc.Status.STATUS_ERROR: case grpc.Status.STATUS_VALIDATION_ERROR: + return RunCodeStatus.validationError; case grpc.Status.STATUS_PREPARATION_ERROR: + return RunCodeStatus.preparationError; + case grpc.Status.STATUS_ERROR: return RunCodeStatus.unknownError; } return RunCodeStatus.unspecified; diff --git a/playground/frontend/lib/modules/editor/repository/code_repository/code_repository.dart b/playground/frontend/lib/modules/editor/repository/code_repository/code_repository.dart index 8f354ce9e8d6..6c777a942bd6 100644 --- a/playground/frontend/lib/modules/editor/repository/code_repository/code_repository.dart +++ b/playground/frontend/lib/modules/editor/repository/code_repository/code_repository.dart @@ -135,6 +135,22 @@ class CodeRepository { output: output.output, log: prevLog, ); + case RunCodeStatus.validationError: + final output = + await _client.getValidationErrorOutput(pipelineUuid, request); + return RunCodeResult( + status: status, + output: output.output, + log: prevLog, + ); + case RunCodeStatus.preparationError: + final output = + await _client.getPreparationErrorOutput(pipelineUuid, request); + return RunCodeResult( + status: status, + output: output.output, + log: prevLog, + ); case RunCodeStatus.unknownError: return RunCodeResult( pipelineUuid: pipelineUuid, diff --git a/playground/frontend/lib/modules/editor/repository/code_repository/run_code_result.dart b/playground/frontend/lib/modules/editor/repository/code_repository/run_code_result.dart index 16e0c33b24ff..a58fad63967a 100644 --- a/playground/frontend/lib/modules/editor/repository/code_repository/run_code_result.dart +++ b/playground/frontend/lib/modules/editor/repository/code_repository/run_code_result.dart @@ -21,13 +21,15 @@ import 'package:flutter/material.dart'; enum RunCodeStatus { unspecified, preparation, + preparationError, + validationError, compiling, - executing, compileError, - timeout, + executing, runError, + finished, + timeout, unknownError, - finished } const kFinishedStatuses = [ @@ -35,6 +37,8 @@ const kFinishedStatuses = [ RunCodeStatus.timeout, RunCodeStatus.compileError, RunCodeStatus.runError, + RunCodeStatus.validationError, + RunCodeStatus.preparationError, RunCodeStatus.finished, ]; diff --git a/playground/frontend/test/modules/editor/repository/code_repository/code_repository_test.dart b/playground/frontend/test/modules/editor/repository/code_repository/code_repository_test.dart index 26edf0960cb7..b61dfe56d39a 100644 --- a/playground/frontend/test/modules/editor/repository/code_repository/code_repository_test.dart +++ b/playground/frontend/test/modules/editor/repository/code_repository/code_repository_test.dart @@ -41,6 +41,8 @@ const kRunOutput = 'RunOutput'; const kLogOutput = 'LogOutput'; const kCompileOutput = 'CompileOutput'; const kRunErrorOutput = 'RunErrorOutput'; +const kPreparationErrorOutput = 'PreparationErrorOutput'; +const kValidationErrorOutput = 'ValidationErrorOutput'; final kRunCodeResponse = RunCodeResponse(kPipelineUuid); final kFinishedStatusResponse = CheckStatusResponse(RunCodeStatus.finished); @@ -49,11 +51,17 @@ final kRunErrorStatusResponse = CheckStatusResponse(RunCodeStatus.runError); final kExecutingStatusResponse = CheckStatusResponse(RunCodeStatus.executing); final kCompileErrorStatusResponse = CheckStatusResponse(RunCodeStatus.compileError); +final kValidationErrorStatusResponse = + CheckStatusResponse(RunCodeStatus.validationError); +final kPreparationErrorStatusResponse = + CheckStatusResponse(RunCodeStatus.preparationError); final kRunOutputResponse = OutputResponse(kRunOutput); final kLogOutputResponse = OutputResponse(kLogOutput); final kCompileOutputResponse = OutputResponse(kCompileOutput); final kRunErrorOutputResponse = OutputResponse(kRunErrorOutput); +final kValidationErrorOutputResponse = OutputResponse(kValidationErrorOutput); +final kPreparationErrorOutputResponse = OutputResponse(kPreparationErrorOutput); @GenerateMocks([CodeClient]) void main() { @@ -145,6 +153,78 @@ void main() { ); }); + test('should return validation error output for validation error', + () async { + // stubs + final client = MockCodeClient(); + when(client.runCode(kRequestMock)).thenAnswer( + (_) async => kRunCodeResponse, + ); + when(client.checkStatus(kPipelineUuid, kRequestMock)).thenAnswer( + (_) async => kValidationErrorStatusResponse, + ); + when(client.getValidationErrorOutput(kPipelineUuid, kRequestMock)) + .thenAnswer( + (_) async => kValidationErrorOutputResponse, + ); + + // test variables + final repository = CodeRepository(client); + final stream = repository.runCode(kRequestMock); + + // test assertion + await expectLater( + stream, + emitsInOrder([ + RunCodeResult( + status: RunCodeStatus.preparation, + log: kProcessingStartedText, + ), + RunCodeResult( + status: RunCodeStatus.validationError, + output: kValidationErrorOutput, + log: kProcessingStartedText, + ), + ]), + ); + }); + + test('should return preparation error output for preparation error', + () async { + // stubs + final client = MockCodeClient(); + when(client.runCode(kRequestMock)).thenAnswer( + (_) async => kRunCodeResponse, + ); + when(client.checkStatus(kPipelineUuid, kRequestMock)).thenAnswer( + (_) async => kPreparationErrorStatusResponse, + ); + when(client.getPreparationErrorOutput(kPipelineUuid, kRequestMock)) + .thenAnswer( + (_) async => kPreparationErrorOutputResponse, + ); + + // test variables + final repository = CodeRepository(client); + final stream = repository.runCode(kRequestMock); + + // test assertion + await expectLater( + stream, + emitsInOrder([ + RunCodeResult( + status: RunCodeStatus.preparation, + log: kProcessingStartedText, + ), + RunCodeResult( + status: RunCodeStatus.preparationError, + output: kPreparationErrorOutput, + log: kProcessingStartedText, + ), + ]), + ); + }); + test('should return output from runError if failed while running', () async { // stubs diff --git a/playground/frontend/test/modules/editor/repository/code_repository/code_repository_test.mocks.dart b/playground/frontend/test/modules/editor/repository/code_repository/code_repository_test.mocks.dart index 1fe6d6b7864a..3c62dbffb60c 100644 --- a/playground/frontend/test/modules/editor/repository/code_repository/code_repository_test.mocks.dart +++ b/playground/frontend/test/modules/editor/repository/code_repository/code_repository_test.mocks.dart @@ -109,5 +109,22 @@ class MockCodeClient extends _i1.Mock implements _i5.CodeClient { Future<_i4.OutputResponse>.value(_FakeOutputResponse_2())) as _i6.Future<_i4.OutputResponse>); @override + _i6.Future<_i4.OutputResponse> getValidationErrorOutput( + String? pipelineUuid, _i7.RunCodeRequestWrapper? request) => + (super.noSuchMethod( + Invocation.method(#getValidationErrorOutput, [pipelineUuid, request]), + returnValue: + Future<_i4.OutputResponse>.value(_FakeOutputResponse_2())) as _i6 + .Future<_i4.OutputResponse>); + @override + _i6.Future<_i4.OutputResponse> getPreparationErrorOutput( + String? pipelineUuid, _i7.RunCodeRequestWrapper? request) => + (super.noSuchMethod( + Invocation.method( + #getPreparationErrorOutput, [pipelineUuid, request]), + returnValue: + Future<_i4.OutputResponse>.value(_FakeOutputResponse_2())) + as _i6.Future<_i4.OutputResponse>); + @override String toString() => super.toString(); } diff --git a/playground/frontend/test/pages/playground/states/example_selector_state_test.mocks.dart b/playground/frontend/test/pages/playground/states/example_selector_state_test.mocks.dart index 5393a6bc1e3b..d84c757963e8 100644 --- a/playground/frontend/test/pages/playground/states/example_selector_state_test.mocks.dart +++ b/playground/frontend/test/pages/playground/states/example_selector_state_test.mocks.dart @@ -82,5 +82,12 @@ class MockExampleClient extends _i1.Mock implements _i5.ExampleClient { Future<_i4.OutputResponse>.value(_FakeOutputResponse_2())) as _i6.Future<_i4.OutputResponse>); @override + _i6.Future<_i4.OutputResponse> getExampleLogs( + _i8.GetExampleRequestWrapper? request) => + (super.noSuchMethod(Invocation.method(#getExampleLogs, [request]), + returnValue: + Future<_i4.OutputResponse>.value(_FakeOutputResponse_2())) + as _i6.Future<_i4.OutputResponse>); + @override String toString() => super.toString(); }