From 3fb17fa6088b55b1e867d565aacddd792d4419ca Mon Sep 17 00:00:00 2001
From: Varun Teja <35555010+VarunSaiTeja@users.noreply.github.com>
Date: Sat, 4 Dec 2021 01:04:14 +0530
Subject: [PATCH] added better example in unit test
---
test/ValidationTests.cs | 104 +++++++++++-------
...re_Validation_Works_On_DuplicateEmail.snap | 16 +++
...Validation_Works_On_NonDuplicateEmail.snap | 5 +
3 files changed, 86 insertions(+), 39 deletions(-)
create mode 100644 test/__snapshots__/ValidationTests.Ensure_Validation_Works_On_DuplicateEmail.snap
create mode 100644 test/__snapshots__/ValidationTests.Ensure_Validation_Works_On_NonDuplicateEmail.snap
diff --git a/test/ValidationTests.cs b/test/ValidationTests.cs
index 6b8ec01..619b5eb 100644
--- a/test/ValidationTests.cs
+++ b/test/ValidationTests.cs
@@ -2,6 +2,7 @@
using HotChocolate.Execution;
using Microsoft.Extensions.DependencyInjection;
using Snapshooter.Xunit;
+using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Threading.Tasks;
using Xunit;
@@ -10,66 +11,82 @@ namespace Graph.ArgumentValidator
{
public class ValidationTests
{
- [Fact]
- public async Task Ensure_Validation_Works_On_Arguments()
+ ///
+ /// Gives the JSON result of execution
+ ///
+ /// GraphQL query to be executed
+ /// JSON result of GraphQL Query
+ static async Task ExecuteRequest(string request)
{
- var result =
- await new ServiceCollection()
- .AddScoped(_ => new Service())
+ var resonse = await new ServiceCollection()
+ .AddScoped(_ => new DataValidatorService())
.AddGraphQL()
.AddQueryType()
.AddArgumentValidator()
- .ExecuteRequestAsync("{ argIsEmail(email: \"abc\") }");
+ .ExecuteRequestAsync(request);
+ return resonse.ToJson();
+ }
+
+ [Fact]
+ public async Task Ensure_Validation_Works_On_Arguments()
+ {
+ var result = await ExecuteRequest("{ argIsEmail(email: \"abc\") }");
- result.ToJson().MatchSnapshot();
+ result.MatchSnapshot();
}
[Fact]
public async Task Ensure_Validation_Works_On_Arguments_ValidEmail()
{
- var result =
- await new ServiceCollection()
- .AddScoped(_ => new Service())
- .AddGraphQL()
- .AddQueryType()
- .AddArgumentValidator()
- .ExecuteRequestAsync("{ argIsEmail(email: \"abc@abc.com\") }");
+ var result = await ExecuteRequest("{ argIsEmail(email: \"abc@abc.com\") }");
- result.ToJson().MatchSnapshot();
+ result.MatchSnapshot();
}
[Fact]
public async Task Ensure_Validation_Works_On_InputObjects()
{
- var result =
- await new ServiceCollection()
- .AddScoped(_ => new Service())
- .AddGraphQL()
- .AddQueryType()
- .AddArgumentValidator()
- .ExecuteRequestAsync("{ argIsInput(input: { email: \"abc\" }) }");
+ var result = await ExecuteRequest("{ argIsInput(input: { email: \"abc\" }) }");
- result.ToJson().MatchSnapshot();
+ result.MatchSnapshot();
}
[Fact]
public async Task Ensure_Validation_Works_On_InputObjects_ValidEmail()
{
- var result =
- await new ServiceCollection()
- .AddScoped(_ => new Service())
- .AddGraphQL()
- .AddQueryType()
- .AddArgumentValidator()
- .ExecuteRequestAsync("{ argIsInput(input: { email: \"abc@abc.com\" }) }");
+ var result = await ExecuteRequest("{ argIsInput(input: { email: \"abc@abc.com\" }) }");
- result.ToJson().MatchSnapshot();
+ result.MatchSnapshot();
+ }
+
+
+ [Fact]
+ public async Task Ensure_Validation_Works_On_DuplicateEmail()
+ {
+ var result = await ExecuteRequest("{ checkDuplicateEmail( email: \"varun@gmail.com\" ) }");
+
+ result.MatchSnapshot();
+ }
+
+ [Fact]
+ public async Task Ensure_Validation_Works_On_NonDuplicateEmail()
+ {
+ var result = await ExecuteRequest("{ checkDuplicateEmail( email: \"sai@gmail.com\" ) }");
+
+ result.MatchSnapshot();
}
}
public class Query
{
- public string ArgIsEmail([EmailAddress][ResolveService] string email) => email;
+ public string ArgIsEmail([EmailAddress] string email) => email;
+
+ ///
+ /// Gives validation failed result if email already exist. Other wise *You are good to go...*
+ ///
+ ///
+ ///
+ public string CheckDuplicateEmail([EmailAddress][DuplicateEmailValidtor] string email) => "You are good to go, this email not registred yet.";
public string ArgIsInput(MyInput input) => input.Email;
}
@@ -78,21 +95,30 @@ public class Query
public class MyInput
{
[EmailAddress]
- [ResolveService]
public string Email { get; set; }
}
- public class Service
+ public class DataValidatorService
{
- public bool CouldBeResolved => true;
+ public bool IsEmailExist(string newEmail)
+ {
+ var existingEmails = new List
+ {
+ "varun@gmail.com",
+ "teja@gmail.com"
+ };
+
+ return !existingEmails.Contains(newEmail);
+ }
}
- public class ResolveServiceAttribute : ValidationAttribute
+ public class DuplicateEmailValidtorAttribute : ValidationAttribute
{
- protected override ValidationResult IsValid(object value, ValidationContext validationContext)
+ protected override ValidationResult IsValid(object valueObj, ValidationContext validationContext)
{
- var service = (Service)validationContext.GetService(typeof(Service));
- return service is { CouldBeResolved: true } ? ValidationResult.Success : new ValidationResult("error");
+ var value = valueObj as string;
+ var service = (DataValidatorService)validationContext.GetService(typeof(DataValidatorService));
+ return service.IsEmailExist(value) ? ValidationResult.Success : new ValidationResult("Email already exist");
}
}
}
diff --git a/test/__snapshots__/ValidationTests.Ensure_Validation_Works_On_DuplicateEmail.snap b/test/__snapshots__/ValidationTests.Ensure_Validation_Works_On_DuplicateEmail.snap
new file mode 100644
index 0000000..545bc67
--- /dev/null
+++ b/test/__snapshots__/ValidationTests.Ensure_Validation_Works_On_DuplicateEmail.snap
@@ -0,0 +1,16 @@
+{
+ "errors": [
+ {
+ "message": "Email already exist",
+ "path": [
+ "email"
+ ],
+ "extensions": {
+ "field": "email"
+ }
+ }
+ ],
+ "data": {
+ "checkDuplicateEmail": null
+ }
+}
\ No newline at end of file
diff --git a/test/__snapshots__/ValidationTests.Ensure_Validation_Works_On_NonDuplicateEmail.snap b/test/__snapshots__/ValidationTests.Ensure_Validation_Works_On_NonDuplicateEmail.snap
new file mode 100644
index 0000000..3b45078
--- /dev/null
+++ b/test/__snapshots__/ValidationTests.Ensure_Validation_Works_On_NonDuplicateEmail.snap
@@ -0,0 +1,5 @@
+{
+ "data": {
+ "checkDuplicateEmail": "You are good to go, this email not registred yet."
+ }
+}