Beispiel #1
0
            public override void Write(Utf8JsonWriter writer, ApiTaskResult <TResult> value, JsonSerializerOptions options)
            {
                var dto = ToDto();

                if (value.TryGetTaskError(out var error))
                {
                    dto.ApiError = error;
                }
                else if (value.TryGetSuccessResult(out var successResult))
                {
                    dto.TaskResult = successResult;
                }

                JsonSerializer.Serialize(writer, dto, options);

                ApiTaskResultDto ToDto()
                {
                    return(new ApiTaskResultDto
                    {
                        Id = value.Id,
                        TaskState = value.TaskState,
                        TaskType = value.TaskType,
                    });
                }
            }
            private ApiTaskResult <TResult, TFailureResult> DeserializeResult(
                JsonDocument jsonDocument,
                string?taskStateValue,
                Guid taskId,
                Urn?taskType,
                JsonSerializerOptions?options)
            {
                var       resultJson = jsonDocument.RootElement.GetProperty(propNames.TaskResultPropName.AsUtf8()).GetRawText();
                Exception?failureSerializationError = null;

                try
                {
                    var failureResult = DeserializeAs <TFailureResult>(resultJson, propNames.TaskResultPropName, taskStateValue, options);
                    if (!failureResult.IsEmpty)
                    {
                        return(ApiTaskResult <TResult, TFailureResult> .FailureResult(failureResult, taskId, taskType));
                    }
                }
                catch (Exception ex)
                {
                    failureSerializationError = ex;
                }

                var successResult = DeserializeAs <TResult>(resultJson, propNames.TaskResultPropName, taskStateValue, options);

                if (successResult.IsEmpty && failureSerializationError is not null)
                {
                    throw failureSerializationError;
                }
                return(ApiTaskResult <TResult, TFailureResult> .Success(successResult, taskId, taskType));
            }
            public override ApiTaskResult <TResult, TFailureResult> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
            {
                using var jsonDocument = JsonDocument.ParseValue(ref reader);
                var taskId = jsonDocument.RootElement.GetProperty(propNames.IdPropName.AsUtf8()).GetGuid();

                var taskStateValue = jsonDocument.RootElement.GetProperty(propNames.TaskStatePropName.AsUtf8()).GetString();
                var taskState      = (ApiTaskState)Enum.Parse(typeof(ApiTaskState), taskStateValue !, true);

                var taskTypeValue = jsonDocument.RootElement.GetProperty(propNames.TaskTypePropName.AsUtf8()).GetString();
                var taskType      = taskTypeValue == null ? null : Urn.Parse(taskTypeValue);

                switch (taskState)
                {
                case ApiTaskState.Running:
                    return(ApiTaskResult <TResult, TFailureResult> .Running(taskId, taskType));

                case ApiTaskState.Succeed:
                    return(DeserializeResult(jsonDocument, taskStateValue, taskId, taskType, options));

                case ApiTaskState.Failed:
                    var errorJson = jsonDocument.RootElement.GetProperty(propNames.ApiErrorPropName.AsUtf8()).GetRawText();
                    var error     = DeserializeAs <ApiError>(errorJson, propNames.ApiErrorPropName, taskStateValue, options);
                    return(ApiTaskResult <TResult, TFailureResult> .TaskFailure(error, taskId, taskType));

                default:
                    throw Errors.UnexpectedEnumMember(nameof(taskState), taskState);
                }
            }
        public void Success_should_fail_if_given_empty_result()
        {
            var id       = Guid.NewGuid();
            var taskType = new Urn("nid", "nss");

            Action action = () => ApiTaskResult <SuccessResult, FailureResult> .Success(SuccessResult.Empty, id, taskType);

            action.Should().Throw <ArgumentException>();
        }
        public void TryGetTaskError_should_return_error_if_api_task_result_is_failure()
        {
            var taskResult = ApiTaskResult <SuccessResult, FailureResult> .FailureResult(new FailureResult(), Guid.NewGuid(), new Urn("nid", "nss"));

            var success = taskResult.TryGetTaskError(out var result);

            success.Should().BeFalse();
            result.Should().BeNull();
        }
        public void TryGetTaskError_should_return_task_error_if_api_task_result_is_api_error()
        {
            var apiError   = AnApiError;
            var taskResult = ApiTaskResult <SuccessResult, FailureResult> .TaskFailure(apiError, Guid.NewGuid(), new Urn("nid", "nss"));

            var success = taskResult.TryGetTaskError(out var result);

            success.Should().BeTrue();
            result.Should().Be(apiError);
        }
        public void TryGetFailureResult_should_return_failure_result_if_api_task_result_is_failure()
        {
            var failureResult = new FailureResult();
            var taskResult    = ApiTaskResult <SuccessResult, FailureResult> .FailureResult(failureResult, Guid.NewGuid(), new Urn("nid", "nss"));

            var success = taskResult.TryGetFailureResult(out var result);

            success.Should().BeTrue();
            result.Should().Be(failureResult);
        }
        public void TryGetSuccessResult_should_return_success_result_if_api_task_result_is_successful()
        {
            var successResult = new SuccessResult();
            var taskResult    = ApiTaskResult <SuccessResult> .Success(successResult, Guid.NewGuid(), new Urn("nid", "nss"));

            var success = taskResult.TryGetSuccessResult(out var result);

            success.Should().BeTrue();
            result.Should().Be(successResult);
        }
        public void FailureResult_should_create_result_in_the_failed_state()
        {
            var id          = Guid.NewGuid();
            var taskType    = new Urn("nid", "nss");
            var expectedDto = new ExpectedResult
            {
                Id        = id,
                TaskType  = taskType,
                TaskState = ApiTaskState.Failed
            };

            var result = ApiTaskResult <SuccessResult, FailureResult> .FailureResult(new FailureResult(), id, taskType);

            result.Should().BeEquivalentTo(expectedDto);
        }
        public void Running_should_create_result_in_the_running_state()
        {
            var id          = Guid.NewGuid();
            var taskType    = new Urn("nid", "nss");
            var expectedDto = new ExpectedResult
            {
                Id        = id,
                TaskType  = taskType,
                TaskState = ApiTaskState.Running
            };

            var result = ApiTaskResult <SuccessResult> .Running(id, taskType);

            result.Should().BeEquivalentTo(expectedDto);
        }
        public void ConvertToSingleApiResult_should_convert_running_result_to_running_result()
        {
            var id          = Guid.NewGuid();
            var taskType    = new Urn("nid", "nss");
            var expectedDto = new ExpectedResult
            {
                Id        = id,
                TaskType  = taskType,
                TaskState = ApiTaskState.Running
            };
            var taskResult = ApiTaskResult <SuccessResult, FailureResult> .Running(id, taskType);

            var oneResultApiResult = taskResult.ConvertToSingleApiResult(
                x => x.Value,
                x => new ApiError(HttpStatusCode.Forbidden, x.Value.ToString())
                );

            oneResultApiResult.Should().BeEquivalentTo(expectedDto);
            oneResultApiResult.TryGetSuccessResult(out _).Should().BeFalse();
        }
Beispiel #12
0
            public override ApiTaskResult <TResult> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
            {
                using var jsonDocument = JsonDocument.ParseValue(ref reader);
                var taskId = jsonDocument.RootElement.GetProperty(propNames.IdPropName.AsUtf8()).GetGuid();

                var taskStateValue = jsonDocument.RootElement.GetProperty(propNames.TaskStatePropName.AsUtf8()).GetString();
                var taskState      = (ApiTaskState)Enum.Parse(typeof(ApiTaskState), taskStateValue !, true);

                var taskTypeValue = jsonDocument.RootElement.GetProperty(propNames.TaskTypePropName.AsUtf8()).GetString();
                var taskType      = taskTypeValue == null ? null : Urn.Parse(taskTypeValue);

                switch (taskState)
                {
                case ApiTaskState.Running:
                    return(ApiTaskResult <TResult> .Running(taskId, taskType));

                case ApiTaskState.Succeed:
                    var resultJson    = jsonDocument.RootElement.GetProperty(propNames.TaskResultPropName.AsUtf8()).GetRawText();
                    var successResult = DeserializeAs <TResult>(resultJson, propNames.TaskResultPropName, taskStateValue);
                    return(ApiTaskResult <TResult> .Success(successResult, taskId, taskType));

                case ApiTaskState.Failed:
                    var errorJson = jsonDocument.RootElement.GetProperty(propNames.ApiErrorPropName.AsUtf8()).GetRawText();
                    var error     = DeserializeAs <ApiError>(errorJson, propNames.ApiErrorPropName, taskStateValue);
                    return(ApiTaskResult <TResult> .TaskFailure(error, taskId, taskType));

                default:
                    throw Errors.UnexpectedEnumMember(nameof(taskState), taskState);
                }

                T DeserializeAs <T>(string json, in Utf8String propName, string?taskStatePropValue)
                {
                    return(JsonSerializer.Deserialize <T>(json, options) ??
                           throw Errors.JsonPropertyCannotBeNullIfAnotherPropertyHasValue(
                               propName.ToString(),
                               propNames.TaskStatePropName.ToString(),
                               taskStatePropValue));
                }
            }
        public void ConvertToSingleApiResult_should_convert_task_error_result_to_api_error()
        {
            var id          = Guid.NewGuid();
            var taskType    = new Urn("nid", "nss");
            var expectedDto = new ExpectedResult
            {
                Id        = id,
                TaskType  = taskType,
                TaskState = ApiTaskState.Failed
            };
            var expectedApiError = new ApiError(HttpStatusCode.Forbidden, "an error");
            var taskResult       = ApiTaskResult <SuccessResult, FailureResult> .TaskFailure(expectedApiError, id, taskType);

            var oneResultApiResult = taskResult.ConvertToSingleApiResult(
                x => x.Value,
                x => new ApiError(HttpStatusCode.Forbidden, x.Value.ToString())
                );

            oneResultApiResult.Should().BeEquivalentTo(expectedDto);
            oneResultApiResult.TryGetTaskError(out var apiError).Should().BeTrue();
            apiError.Should().BeEquivalentTo(expectedApiError);
        }
Beispiel #14
0
 public void Should_serialize_deserialize_task_result_of_one_results_in_running_state(ApiTaskResult <SuccessResult> taskResult)
 {
     Should_serialize_deserialize_as_expected(taskResult);
 }