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." + } +}