Skip to content

Commit

Permalink
refactor: reduce duplication in ResultAssertions
Browse files Browse the repository at this point in the history
  • Loading branch information
Tr00d committed Oct 20, 2023
1 parent 929b331 commit 75bb036
Showing 1 changed file with 30 additions and 44 deletions.
74 changes: 30 additions & 44 deletions Vonage.Common.Test/Extensions/ResultAssertionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,101 +14,87 @@ public ResultAssertionExtensions(Result<T> subject) : base(subject)

public AndConstraint<ResultAssertionExtensions<T>> BeFailure(Action<IResultFailure> action)
{
Execute.Assertion
.WithExpectation("Expected {context:result} to be Failure{reason}, ")
.Given(() => this.Subject)
.ForCondition(subject => subject.IsFailure)
.FailWith($"but found to be Success '{this.GetResultSuccess()}'.");
this.BuildFailureExpectation();
this.Subject.IfFailure(action);
return new AndConstraint<ResultAssertionExtensions<T>>(this);
}

public AndConstraint<ResultAssertionExtensions<T>> BeFailure()
{
Execute.Assertion
.WithExpectation("Expected {context:result} to be Failure{reason}, ")
.Given(() => this.Subject)
.ForCondition(subject => subject.IsFailure)
.FailWith($"but found to be Success '{this.GetResultSuccess()}'.");
this.BuildFailureExpectation();
return new AndConstraint<ResultAssertionExtensions<T>>(this);
}

public AndConstraint<ResultAssertionExtensions<T>> BeFailure(IResultFailure expected)
{
Execute.Assertion
.WithExpectation("Expected {context:result} to be Failure {0}, ", expected.GetFailureMessage())
.Given(() => this.Subject)
.ForCondition(subject => subject.IsFailure)
.FailWith($"but found to be Success '{this.GetResultSuccess()}'.")
this.BuildFailureExpectation()
.Then
.ForCondition(subject => subject.Equals(Result<T>.FromFailure(expected)))
.FailWith($"but found to be Failure '{this.GetResultFailure()}'.");
.FailWith(this.BuildResultFailureMessage());
return new AndConstraint<ResultAssertionExtensions<T>>(this);
}

public AndConstraint<ResultAssertionExtensions<T>> BeParsingFailure(params string[] failureMessages)
{
Execute.Assertion
.WithExpectation("Expected {context:result} to be Failure {reason}, ")
.Given(() => this.Subject)
.ForCondition(subject => subject.IsFailure)
.FailWith($"but found to be Success '{this.GetResultSuccess()}'.")
this.BuildFailureExpectation()
.Then
.ForCondition(subject =>
subject.Equals(Result<T>.FromFailure(
ParsingFailure.FromFailures(failureMessages.Select(ResultFailure.FromErrorMessage).ToArray()))))
.FailWith($"but found to be Failure '{this.GetResultFailure()}'.");
.FailWith(this.BuildResultFailureMessage());
return new AndConstraint<ResultAssertionExtensions<T>>(this);
}

public AndConstraint<ResultAssertionExtensions<T>> BeResultFailure(string expectedMessage)
{
Execute.Assertion
.WithExpectation("Expected {context:result} to be Failure {reason}, ")
.Given(() => this.Subject)
.ForCondition(subject => subject.IsFailure)
.FailWith($"but found to be Success '{this.GetResultSuccess()}'.")
this.BuildFailureExpectation()
.Then
.ForCondition(subject =>
subject.Equals(Result<T>.FromFailure(ResultFailure.FromErrorMessage(expectedMessage))))
.FailWith($"but found to be Failure '{this.GetResultFailure()}'.");
.FailWith(this.BuildResultFailureMessage());
return new AndConstraint<ResultAssertionExtensions<T>>(this);
}

public AndConstraint<ResultAssertionExtensions<T>> BeSuccess()
{
Execute.Assertion
.WithExpectation("Expected {context:result} to be Success{reason}, ")
.Given(() => this.Subject)
.ForCondition(subject => subject.IsSuccess)
.FailWith($"but found to be Failure '{this.GetResultFailure()}'.");
this.BuildSuccessExpectation();
return new AndConstraint<ResultAssertionExtensions<T>>(this);
}

public AndConstraint<ResultAssertionExtensions<T>> BeSuccess(Action<T> action)
{
Execute.Assertion
.WithExpectation("Expected {context:result} to be Success{reason}, ")
.Given(() => this.Subject)
.ForCondition(subject => subject.IsSuccess)
.FailWith($"but found to be Failure '{this.GetResultFailure()}'.");
this.BuildSuccessExpectation();
this.Subject.IfSuccess(action);
return new AndConstraint<ResultAssertionExtensions<T>>(this);
}

public AndConstraint<ResultAssertionExtensions<T>> BeSuccess(T expected)
{
Execute.Assertion
.WithExpectation("Expected {context:result} to be Success {0}, ", expected.ToString())
.Given(() => this.Subject)
.ForCondition(subject => subject.IsSuccess)
.FailWith($"but found to be Failure '{this.GetResultFailure()}'.")
this.BuildSuccessExpectation()
.Then
.ForCondition(subject => subject.Equals(Result<T>.FromSuccess(expected)))
.FailWith($"but found to be Success '{this.GetResultSuccess()}'.");
.FailWith(this.BuildResultSuccessMessage());
return new AndConstraint<ResultAssertionExtensions<T>>(this);
}

private ContinuationOfGiven<Result<T>> BuildFailureExpectation() =>
Execute.Assertion
.WithExpectation("Expected {context:result} to be Failure{reason}, ")
.Given(() => this.Subject)
.ForCondition(subject => subject.IsFailure)
.FailWith(this.BuildResultFailureMessage());

private string BuildResultFailureMessage() => $"but found to be Failure '{this.GetResultFailure()}'.";

private string BuildResultSuccessMessage() => $"but found to be Success '{this.GetResultSuccess()}'.";

private ContinuationOfGiven<Result<T>> BuildSuccessExpectation() =>
Execute.Assertion
.WithExpectation("Expected {context:result} to be Success{reason}, ")
.Given(() => this.Subject)
.ForCondition(subject => subject.IsSuccess)
.FailWith(this.BuildResultSuccessMessage());

private string GetResultFailure() =>
this.Subject.Match(_ => string.Empty, failure => failure.GetFailureMessage());

Expand Down

0 comments on commit 75bb036

Please sign in to comment.