Skip to content

Commit

Permalink
More unit test and some clean up
Browse files Browse the repository at this point in the history
  • Loading branch information
PaulMiami committed Jun 29, 2016
1 parent 6aad315 commit 7e2762f
Show file tree
Hide file tree
Showing 11 changed files with 411 additions and 8 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Expand Up @@ -233,3 +233,7 @@ _Pvt_Extensions

# FAKE - F# Make
.fake/

# OpenCover and ReportGenerator
coverage.xml
Report/
4 changes: 4 additions & 0 deletions src/PaulMiami.AspNetCore.Mvc.Recaptcha/RecaptchaService.cs
Expand Up @@ -120,6 +120,10 @@ private string GetErrrorMessage(RecaptchaValidationResponse validationResponse)
}
}
}
else
{
return Resources.ValidateError_UnspecifiedRemoteServerError;
}

return string.Join(Environment.NewLine, errorList);
}
Expand Down
9 changes: 9 additions & 0 deletions src/PaulMiami.AspNetCore.Mvc.Recaptcha/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/PaulMiami.AspNetCore.Mvc.Recaptcha/Resources.resx
Expand Up @@ -141,4 +141,7 @@
<data name="ValidateError_Unknown" xml:space="preserve">
<value>Unknown error '{0}'.</value>
</data>
<data name="ValidateError_UnspecifiedRemoteServerError" xml:space="preserve">
<value>Unspecified remote server error.</value>
</data>
</root>
Expand Up @@ -20,8 +20,7 @@ public class RecaptchaScriptTagHelper : TagHelper

public RecaptchaScriptTagHelper(RecaptchaService service)
{
if (service == null)
throw new ArgumentNullException(nameof(service));
service.CheckArgumentNull(nameof(service));

_service = service;
}
Expand All @@ -30,7 +29,7 @@ public RecaptchaScriptTagHelper(RecaptchaService service)
public bool? JqueryValidation { get; set; }

[HtmlAttributeName(ValidationMessageElementIdAttributeName)]
public string ValidationMessageElementID { get; set; }
public string ValidationMessageElementId { get; set; }

public override void Process(TagHelperContext context, TagHelperOutput output)
{
Expand All @@ -45,7 +44,7 @@ public override void Process(TagHelperContext context, TagHelperOutput output)
var script = new TagBuilder("script");
script.TagRenderMode = TagRenderMode.Normal;
script.InnerHtml.AppendHtml(string.Format(_scriptSnippet,
RecaptchaTagHelper.RecaptchaValidationJSCallBack, ValidationMessageElementID, _service.ValidationMessage));
RecaptchaTagHelper.RecaptchaValidationJSCallBack, ValidationMessageElementId, _service.ValidationMessage));

output.PostElement.AppendHtml(script);
}
Expand Down
Expand Up @@ -33,8 +33,7 @@ public class RecaptchaTagHelper : TagHelper

public RecaptchaTagHelper(RecaptchaService service)
{
if (service == null)
throw new ArgumentNullException(nameof(service));
service.CheckArgumentNull(nameof(service));

_service = service;
}
Expand Down
@@ -0,0 +1,28 @@
#region License
//Copyright(c) Paul Biccherai
//Licensed under the MIT license. See LICENSE file in the project root for full license information.
#endregion

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Linq;
using Xunit;

namespace PaulMiami.AspNetCore.Mvc.Recaptcha.Test
{
public class RecaptchaServiceCollectionExtensionsTest
{
[Fact]
public void Success()
{
var services = new ServiceCollection();

services.AddRecaptcha(new RecaptchaOptions());

Assert.True(services.Where(serviceDescriptor => serviceDescriptor.ServiceType == typeof(IOptions<RecaptchaOptions>)).Count() == 1);
Assert.True(services.Where(serviceDescriptor => serviceDescriptor.ServiceType == typeof(RecaptchaService)).Count() == 1);
Assert.True(services.Where(serviceDescriptor => serviceDescriptor.ServiceType == typeof(IRecaptchaValidationService)).Count() == 1);
Assert.True(services.Where(serviceDescriptor => serviceDescriptor.ServiceType == typeof(ValidateRecaptchaFilter)).Count() == 1);
}
}
}
Expand Up @@ -32,7 +32,6 @@ public IOptions<RecaptchaOptions> GetOptions()
public void MissingOptions()
{
var ex = Assert.Throws<ArgumentNullException>(() => new RecaptchaService(null));
Assert.Equal("options", ex.ParamName);

}

Expand Down Expand Up @@ -138,7 +137,8 @@ public async Task ValidateSuccess()
[InlineData("invalid-input-secret", "The secret parameter is invalid or malformed.")]
[InlineData("missing-input-response", "The response parameter is missing.")]
[InlineData("invalid-input-response", "The response parameter is invalid or malformed.")]
public async Task ValidateMissingSecret(string serviceErrorCode, string exceptionMessage)
[InlineData("new error code never seen before", "Unknown error 'new error code never seen before'.")]
public async Task ValidateServerErrors(string serviceErrorCode, string exceptionMessage)
{
var captchaResponse = Guid.NewGuid().ToString();
var ipAddress = Guid.NewGuid().ToString();
Expand All @@ -149,5 +149,18 @@ public async Task ValidateMissingSecret(string serviceErrorCode, string exceptio
var ex = await Assert.ThrowsAsync<RecaptchaValidationException>(async () => await service.ValidateResponseAsync(captchaResponse, ipAddress));
Assert.Equal(exceptionMessage, ex.Message);
}

[Fact]
public async Task ValidateServerErrorNoDescription()
{
var captchaResponse = Guid.NewGuid().ToString();
var ipAddress = Guid.NewGuid().ToString();

var service = CreateTestService(System.Net.HttpStatusCode.OK,
new RecaptchaValidationResponse { Success = false, ErrorCodes = null }, captchaResponse, ipAddress );

var ex = await Assert.ThrowsAsync<RecaptchaValidationException>(async () => await service.ValidateResponseAsync(captchaResponse, ipAddress));
Assert.Equal("Unspecified remote server error.", ex.Message);
}
}
}
@@ -0,0 +1,131 @@
#region License
//Copyright(c) Paul Biccherai
//Licensed under the MIT license. See LICENSE file in the project root for full license information.
#endregion

using Microsoft.AspNetCore.Razor.TagHelpers;
using Microsoft.Extensions.Options;
using PaulMiami.AspNetCore.Mvc.Recaptcha.TagHelpers;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;

namespace PaulMiami.AspNetCore.Mvc.Recaptcha.Test.TagHelpers
{
public class RecaptchaScriptTagHelperTest
{
private const string _script = "<script>var {0}=function(e){{var r=$('#{1}');r.length&&r.hide()}};$.validator.setDefaults({{submitHandler:function(){{var e=this,r=''!==grecaptcha.getResponse(),a='{2}',t=$('#{1}');return a&&(r?t.length&&t.hide():(e.errorList.push({{message:a}}),$(e.currentForm).triggerHandler('invalid-form',[e]),t.length&&(t.html(a),t.show()))),r}}}});</script>";
private readonly string _siteKey = Guid.NewGuid().ToString();
private readonly string _secretKey = Guid.NewGuid().ToString();

public IOptions<RecaptchaOptions> GetOptions()
{
return new OptionsWrapper<RecaptchaOptions>(new RecaptchaOptions
{
SiteKey = _siteKey,
SecretKey = _secretKey
});
}

private TagHelperOutput ProcessTagHelper(RecaptchaService service, TagHelperAttributeList attributes, Action<RecaptchaScriptTagHelper> config = null)
{
var tagHelper = new RecaptchaScriptTagHelper(service);

config?.Invoke(tagHelper);

var tagHelperContext = new TagHelperContext(
allAttributes: new TagHelperAttributeList(),
items: new Dictionary<object, object>(),
uniqueId: "test");

var output = new TagHelperOutput(
tagName: "doesntmatter",
attributes: attributes,
getChildContentAsync: (useCachedResult, encoder) =>
{
return Task.FromResult<TagHelperContent>(new DefaultTagHelperContent());
});

tagHelper.Process(tagHelperContext, output);

return output;
}

[Fact]
public void MissingService()
{
var ex = Assert.Throws<ArgumentNullException>(() => new RecaptchaTagHelper(null));
}

[Fact]
public void NoOptions()
{
var options = GetOptions();
var src = Guid.NewGuid().ToString();
var validationMessage = Guid.NewGuid().ToString();
options.Value.JavaScriptUrl = src;
options.Value.ValidationMessage = validationMessage;
var service = new RecaptchaService(options);

var output = ProcessTagHelper(service, new TagHelperAttributeList());

Assert.Equal("script", output.TagName);
Assert.Equal(TagMode.StartTagAndEndTag, output.TagMode);
Assert.NotNull(output.Attributes["src"]);
Assert.Equal(src, output.Attributes["src"].Value);
Assert.NotNull(output.Attributes["async"]);
Assert.Equal(string.Empty, output.Attributes["async"].Value);
Assert.NotNull(output.Attributes["defer"]);
Assert.Equal(string.Empty, output.Attributes["defer"].Value);
Assert.Equal(string.Format(_script, "recaptchaValidated", string.Empty, validationMessage), output.PostElement.GetContent());
}

[Fact]
public void JqueryValidationDisabledOptions()
{
var options = GetOptions();
var src = Guid.NewGuid().ToString();
var validationMessage = Guid.NewGuid().ToString();
options.Value.JavaScriptUrl = src;
options.Value.ValidationMessage = validationMessage;
var service = new RecaptchaService(options);

var output = ProcessTagHelper(service, new TagHelperAttributeList(), (th)=> th.JqueryValidation = false);

Assert.Equal("script", output.TagName);
Assert.Equal(TagMode.StartTagAndEndTag, output.TagMode);
Assert.NotNull(output.Attributes["src"]);
Assert.Equal(src, output.Attributes["src"].Value);
Assert.NotNull(output.Attributes["async"]);
Assert.Equal(string.Empty, output.Attributes["async"].Value);
Assert.NotNull(output.Attributes["defer"]);
Assert.Equal(string.Empty, output.Attributes["defer"].Value);
Assert.Equal(string.Empty, output.PostElement.GetContent());
}

[Fact]
public void ValidationMessageElementIdDisabledOptions()
{
var options = GetOptions();
var src = Guid.NewGuid().ToString();
var validationMessage = Guid.NewGuid().ToString();
var validationMessageElementId = Guid.NewGuid().ToString();
options.Value.JavaScriptUrl = src;
options.Value.ValidationMessage = validationMessage;
var service = new RecaptchaService(options);

var output = ProcessTagHelper(service, new TagHelperAttributeList(), (th)=>th.ValidationMessageElementId = validationMessageElementId);

Assert.Equal("script", output.TagName);
Assert.Equal(TagMode.StartTagAndEndTag, output.TagMode);
Assert.NotNull(output.Attributes["src"]);
Assert.Equal(src, output.Attributes["src"].Value);
Assert.NotNull(output.Attributes["async"]);
Assert.Equal(string.Empty, output.Attributes["async"].Value);
Assert.NotNull(output.Attributes["defer"]);
Assert.Equal(string.Empty, output.Attributes["defer"].Value);
Assert.Equal(string.Format(_script, "recaptchaValidated", validationMessageElementId, validationMessage), output.PostElement.GetContent());
}
}
}

0 comments on commit 7e2762f

Please sign in to comment.