Skip to content

Commit 0c1c1fa

Browse files
committed
Forms controller unit tests.
Configuration app settings wrapper. Refactoring.
1 parent 72a4846 commit 0c1c1fa

File tree

12 files changed

+1021
-14
lines changed

12 files changed

+1021
-14
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<%@ Page Language="C#" AutoEventWireup="True" Inherits="Umbraco.Web.UI.Config.Splashes.NoNodes" CodeBehind="NoNodes.aspx.cs" %>
2+
<%@ Import Namespace="Umbraco.Core.Configuration" %>
3+
<%@ Import Namespace="Umbraco.Core.IO" %>
4+
5+
<!doctype html>
6+
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
7+
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
8+
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
9+
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
10+
<head>
11+
<meta charset="utf-8">
12+
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
13+
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
14+
15+
<title></title>
16+
<meta name="description" content="">
17+
<meta name="author" content="">
18+
19+
<link rel="stylesheet" href="../../Umbraco/assets/css/nonodes.style.min.css" />
20+
21+
</head>
22+
<body>
23+
24+
<section>
25+
<article>
26+
<div>
27+
<div class="logo"></div>
28+
29+
<h1>Welcome to your Umbraco installation</h1>
30+
<h3>You're seeing this wonderful page because your website doesn't contain any published content yet.</h3>
31+
32+
<div class="cta">
33+
<a href="<%= IOHelper.ResolveUrl(SystemDirectories.Umbraco) %>" class="button">Open Umbraco</a>
34+
</div>
35+
36+
37+
<div class="row">
38+
<div class="col">
39+
<h2>Easy start with Umbraco.tv</h2>
40+
<p>We have created a bunch of 'how-to' videos, to get you easily started with Umbraco. Learn how to build projects in just a couple of minutes. Easiest CMS in the world.</p>
41+
42+
<a href="https://umbraco.tv?ref=tvFromInstaller" target="_blank">Umbraco.tv &rarr;</a>
43+
</div>
44+
45+
<div class="col">
46+
<h2>Be a part of the community</h2>
47+
<p>The Umbraco community is the best of its kind, be sure to visit, and if you have any questions, we're sure that you can get your answers from the community.</p>
48+
49+
<a href="https://our.umbraco.com/?ref=ourFromInstaller" target="_blank">our.Umbraco &rarr;</a>
50+
</div>
51+
</div>
52+
53+
</div>
54+
</article>
55+
56+
</section>
57+
58+
<script src="https://code.jquery.com/jquery-latest.min.js"></script>
59+
60+
</body>
61+
</html>
Lines changed: 306 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,306 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Net;
6+
using System.Net.Http;
7+
using System.Text;
8+
using System.Threading;
9+
using System.Threading.Tasks;
10+
using System.Web;
11+
using Microsoft.AspNet.SignalR.Hubs;
12+
using Moq;
13+
using Moq.Protected;
14+
using Newtonsoft.Json;
15+
using NUnit.Framework;
16+
using NUnit.Framework.Internal;
17+
using Umbraco.Cms.Integrations.Crm.Hubspot.Configuration;
18+
using Umbraco.Cms.Integrations.Crm.Hubspot.Controllers;
19+
using Umbraco.Cms.Integrations.Crm.Hubspot.Models.Dtos;
20+
using Umbraco.Cms.Integrations.Crm.Hubspot.Services;
21+
using Umbraco.Core.Composing;
22+
using Umbraco.Core.Configuration;
23+
using Umbraco.Core.Configuration.UmbracoSettings;
24+
using Umbraco.Core.Logging;
25+
using Umbraco.Web;
26+
using Umbraco.Web.Routing;
27+
using Umbraco.Web.Security;
28+
using ILogger = Umbraco.Core.Logging.ILogger;
29+
30+
namespace Umbraco.Cms.Integrations.Crm.Hubspot.Tests.Controllers
31+
{
32+
[TestFixture]
33+
public class FormsControllerTests
34+
{
35+
private readonly string InvalidApiKey = @"{
36+
""status"": ""error"",
37+
""message"": ""This hapikey doesn't exist."",
38+
""correlationId"": ""73f4a25b-7b0a-4537-a490-e5c226619d59""
39+
}";
40+
41+
private readonly string ExpiredOAuthToken = @"{
42+
""status"": ""error"",
43+
""message"": ""This oauth-token is expired! expiresAt: 1643194402611, now: 1643972072320"",
44+
""correlationId"": ""1ae46a55-f5b9-4f68-811a-695a12aaa4f5"",
45+
""category"": ""EXPIRED_AUTHENTICATION"",
46+
""errors"": [
47+
{
48+
""message"": ""The OAuth token used to make this call expired 9 day(s) ago.""
49+
}
50+
]
51+
}";
52+
53+
private Mock<IAppSettings> MockedAppSettingsApiSetup;
54+
55+
private Mock<IAppSettings> MockedAppSettingsOAuthSetup;
56+
57+
private Mock<ILogger> MockedLogger;
58+
59+
public FormsControllerTests()
60+
{
61+
Current.Factory = new Mock<IFactory>().Object;
62+
}
63+
64+
[SetUp]
65+
public void Init()
66+
{
67+
MockedAppSettingsApiSetup = CreateMockedAppSettings(true);
68+
69+
MockedAppSettingsOAuthSetup = CreateMockedAppSettings(includeOAuthSettings: true);
70+
71+
MockedLogger = new Mock<ILogger>();
72+
}
73+
74+
[Test]
75+
public void CheckApiConfiguration_GetApiKey_ShouldReturnTrue()
76+
{
77+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), Mock.Of<ILogger>());
78+
79+
var result = sut.CheckApiConfiguration();
80+
81+
Assert.IsTrue(result);
82+
}
83+
84+
[Test]
85+
public void CheckOAuthConfiguration_GetOAuthConfig_ShouldReturnTrue()
86+
{
87+
var sut = new FormsController(MockedAppSettingsOAuthSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), Mock.Of<ILogger>());
88+
89+
var result = sut.CheckOAuthConfiguration();
90+
91+
Assert.IsTrue(result);
92+
}
93+
94+
#region GetAllUsingApiKey
95+
96+
[Test]
97+
public async Task GetAll_WithoutApiKey_ShouldReturnInvalidResponseObjectWithLoggedInfo()
98+
{
99+
var sut = new FormsController(Mock.Of<IAppSettings>(), Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), MockedLogger.Object);
100+
101+
var result = await sut.GetAll();
102+
103+
MockedLogger.Verify(x => x.Info(It.Is<Type>(y => y == typeof(FormsController)), It.IsAny<string>()), Times.Once);
104+
105+
Assert.That(result.IsValid, Is.False);
106+
Assert.That(result.IsExpired, Is.False);
107+
}
108+
109+
[Test]
110+
public async Task GetAll_WithUnauthorizedRequest_ShouldReturnExpiredResponseObjectWithLoggedError()
111+
{
112+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), MockedLogger.Object);
113+
114+
var httpClient = CreateMockedHttpClient(HttpStatusCode.Unauthorized, InvalidApiKey);
115+
FormsController.ClientFactory = () => httpClient;
116+
117+
var result = await sut.GetAll();
118+
119+
MockedLogger.Verify(x => x.Error(It.Is<Type>(y => y == typeof(FormsController)), It.IsAny<string>()), Times.Once);
120+
121+
Assert.That(result.IsValid, Is.False);
122+
Assert.That(result.IsExpired, Is.True);
123+
}
124+
125+
[Test]
126+
public async Task GetAll_WithSuccessfulRequest_ShouldReturnResponseObjectWithFormsCollection()
127+
{
128+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), MockedLogger.Object);
129+
130+
var response = File.ReadAllText(TestContext.CurrentContext.TestDirectory + "\\Data\\mockResponseApiSetup.json");
131+
132+
var httpClient = CreateMockedHttpClient(HttpStatusCode.OK, response);
133+
FormsController.ClientFactory = () => httpClient;
134+
135+
var result = await sut.GetAll();
136+
137+
Assert.That(result.IsValid, Is.True);
138+
Assert.That(result.IsExpired, Is.False);
139+
Assert.AreEqual(1, result.Forms.Count);
140+
}
141+
142+
[Test]
143+
public async Task GetAll_WithFailedRequest_ShouldReturnDefaultResponseObjectWithLoggedError()
144+
{
145+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), Mock.Of<ITokenService>(), MockedLogger.Object);
146+
147+
var response = File.ReadAllText(TestContext.CurrentContext.TestDirectory + "\\Data\\mockResponseApiSetup.json");
148+
149+
var httpClient = CreateMockedHttpClient(HttpStatusCode.InternalServerError, response);
150+
FormsController.ClientFactory = () => httpClient;
151+
152+
var result = await sut.GetAll();
153+
154+
MockedLogger.Verify(x => x.Error(It.Is<Type>(y => y == typeof(FormsController)), It.IsAny<string>()), Times.Once);
155+
156+
Assert.That(result.IsExpired, Is.False);
157+
Assert.That(result.IsValid, Is.False);
158+
Assert.That(result.Forms, Is.Empty);
159+
}
160+
161+
#endregion
162+
163+
#region GetAllUsingOAuth
164+
165+
[Test]
166+
public async Task GetAllOAuth_WithoutAccessToken_ShouldReturnInvalidResponseObjectWithLoggedInfo()
167+
{
168+
var mockedTokenService = CreateMockedTokenService(false);
169+
170+
var sut = new FormsController(Mock.Of<IAppSettings>(), Mock.Of<IHubspotService>(), mockedTokenService.Object, MockedLogger.Object);
171+
172+
var result = await sut.GetAllOAuth();
173+
174+
MockedLogger.Verify(x => x.Info(It.Is<Type>(y => y == typeof(FormsController)), It.IsAny<string>()), Times.Once);
175+
176+
Assert.That(result.IsValid, Is.False);
177+
Assert.That(result.IsExpired, Is.False);
178+
}
179+
180+
[Test]
181+
public async Task GetAllOAuth_WithUnauthorizedRequest_ShouldReturnExpiredResponseObjectWithLoggedError()
182+
{
183+
var mockedTokenService = CreateMockedTokenService(true);
184+
185+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), mockedTokenService.Object, MockedLogger.Object);
186+
187+
var httpClient = CreateMockedHttpClient(HttpStatusCode.Unauthorized);
188+
FormsController.ClientFactory = () => httpClient;
189+
190+
var result = await sut.GetAllOAuth();
191+
192+
MockedLogger.Verify(x => x.Error(It.Is<Type>(y => y == typeof(FormsController)), It.IsAny<string>()), Times.Once);
193+
194+
Assert.That(result.IsValid, Is.False);
195+
Assert.That(result.IsExpired, Is.True);
196+
}
197+
198+
[Test]
199+
public async Task GetAllOAuth_WithSuccessfulRequest_ShouldReturnResponseObjectWithFormsCollection()
200+
{
201+
var mockedTokenService = CreateMockedTokenService(true);
202+
203+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), mockedTokenService.Object, MockedLogger.Object);
204+
205+
var response = File.ReadAllText(TestContext.CurrentContext.TestDirectory + "\\Data\\mockResponseOAuthSetup.json");
206+
207+
var httpClient = CreateMockedHttpClient(HttpStatusCode.OK, response);
208+
FormsController.ClientFactory = () => httpClient;
209+
210+
var result = await sut.GetAll();
211+
212+
Assert.That(result.IsValid, Is.True);
213+
Assert.That(result.IsExpired, Is.False);
214+
Assert.AreEqual(1, result.Forms.Count);
215+
}
216+
217+
[Test]
218+
public async Task GetAllOAuth_WithFailedRequest_ShouldReturnDefaultResponseObjectWithLoggedError()
219+
{
220+
var mockedTokenService = CreateMockedTokenService(true);
221+
222+
var sut = new FormsController(MockedAppSettingsApiSetup.Object, Mock.Of<IHubspotService>(), mockedTokenService.Object, MockedLogger.Object);
223+
224+
var response = File.ReadAllText(TestContext.CurrentContext.TestDirectory + "\\Data\\mockResponseApiSetup.json");
225+
226+
var httpClient = CreateMockedHttpClient(HttpStatusCode.InternalServerError, response);
227+
FormsController.ClientFactory = () => httpClient;
228+
229+
var result = await sut.GetAll();
230+
231+
MockedLogger.Verify(x => x.Error(It.Is<Type>(y => y == typeof(FormsController)), It.IsAny<string>()), Times.Once);
232+
233+
Assert.That(result.IsExpired, Is.False);
234+
Assert.That(result.IsValid, Is.False);
235+
Assert.That(result.Forms, Is.Empty);
236+
}
237+
238+
#endregion
239+
240+
private static Mock<IAppSettings> CreateMockedAppSettings(bool includeApiKeySettings = false, bool includeOAuthSettings = false)
241+
{
242+
var mockedAppSettings = new Mock<IAppSettings>();
243+
244+
if (includeApiKeySettings)
245+
{
246+
mockedAppSettings
247+
.Setup(c => c[AppSettingsConstants.UmbracoCmsIntegrationsCrmHubspotApiKey])
248+
.Returns("test-api-key");
249+
}
250+
251+
if (includeOAuthSettings)
252+
{
253+
mockedAppSettings
254+
.Setup(c => c[AppSettingsConstants.UmbracoCmsIntegrationsCrmHubspotOAuthClientId])
255+
.Returns("74d31aa7-337d-40fb-b44b-940e8733eb65");
256+
mockedAppSettings
257+
.Setup(c => c[AppSettingsConstants.UmbracoCmsIntegrationsCrmHubspotOAuthScopes])
258+
.Returns("oauth,forms");
259+
mockedAppSettings
260+
.Setup(c => c[AppSettingsConstants.UmbracoCmsIntegrationsCrmHubspotOAuthRedirectUrl])
261+
.Returns("https://localhost://oauth/umbraco");
262+
mockedAppSettings
263+
.Setup(c => c[AppSettingsConstants.UmbracoCmsIntegrationsOAuthProxyUrl])
264+
.Returns("https://localhost");
265+
}
266+
267+
return mockedAppSettings;
268+
}
269+
270+
private static Mock<ITokenService> CreateMockedTokenService(bool includeAccessToken)
271+
{
272+
var mockedTokenService = new Mock<ITokenService>();
273+
274+
if (includeAccessToken)
275+
{
276+
string key = "Umbraco.Cms.Integrations.Hubspot.AccessTokenDbKey";
277+
string expectedValue = "CNzV5ansLxICBAMY7N6UDCDJ3LYNKNuEJjIUnFi8abi-btslTeL14maOJ3J7CK86KABAIEEAAAAAAAAwAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFCFEZUslFv3AAjejJzrxfHYDNIvbcnSgNldTFSAFoA";
278+
279+
mockedTokenService.Setup(x => x.TryGetParameters(key, out expectedValue)).Returns(true);
280+
}
281+
282+
return mockedTokenService;
283+
}
284+
285+
286+
private static HttpClient CreateMockedHttpClient(HttpStatusCode statusCode, string responseContent = "")
287+
{
288+
var handlerMock = new Mock<HttpMessageHandler>();
289+
handlerMock
290+
.Protected()
291+
.Setup<Task<HttpResponseMessage>>(
292+
"SendAsync",
293+
ItExpr.IsAny<HttpRequestMessage>(),
294+
ItExpr.IsAny<CancellationToken>())
295+
.ReturnsAsync(new HttpResponseMessage()
296+
{
297+
StatusCode = statusCode,
298+
Content = new StringContent(responseContent)
299+
});
300+
301+
var httpClient = new HttpClient(handlerMock.Object);
302+
303+
return httpClient;
304+
}
305+
}
306+
}

0 commit comments

Comments
 (0)