/// <inheritdoc/> public async Task <IUrl> ExpandAsync() { if (this.ExpanderRequest == null) { throw new InvalidOperationException("request payload is not ready"); } var response = await this._expander.ExpandAsync(this.ExpanderRequest).ConfigureAwait(false); if (response != null) { this.Shortened = response.Shortened; this.UrlId = response.UrlId; this.EntityId = response.EntityId; this.Original = response.Original; this.ShortUrl = response.ShortUrl; this.Title = response.Title; this.Description = response.Description; this.Owner = response.Owner; this.CoOwners = response.CoOwners; this.HitCount = response.HitCount; } this.ExpanderResponse = response; if (response != null) { this.ExpanderResponse.RequestHeaders = this.ExpanderRequestHeaders; this.ExpanderResponse.RequestQueries = this.ExpanderRequestQueries; } return(this); }
public void Given_Type_When_Instantiated_Then_It_Should_Return_Result() { var entity = new ExpanderResponse(); entity.CoOwners.Should().NotBeNull() .And.HaveCount(0); }
public async Task Given_ExpanderResponse_When_UpdateRecordAsync_Invoked_Then_It_Should_Return_Result() { var utcNow = DateTimeOffset.UtcNow; var entityId = Guid.NewGuid(); var shortener = new Mock <IShortenerService>(); var expander = new Mock <IExpanderService>(); var response = new ExpanderResponse(); response.DateGenerated = utcNow; response.DateUpdated = utcNow; var url = new Url(shortener.Object, expander.Object); typeof(Url).GetProperty("ExpanderResponse", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, response); typeof(Url).GetProperty("DateGenerated", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, utcNow); var result = await url.UpdateRecordAsync <ExpanderResponse>(utcNow, entityId) .ConfigureAwait(false); result.Should().BeOfType <Url>() .And.BeAssignableTo <IUrl>(); url.DateGenerated.Should().Be(utcNow); url.DateUpdated.Should().Be(utcNow); }
public async Task Given_ShortUrl_When_UpsertAsync_With_VisitItemEntity_Invoked_Then_It_Should_Return_Result(HttpStatusCode statusCode) { var settings = this._mocker.CreateAppSettingsInstance(); var item = new VisitItemEntity() { UrlId = Guid.NewGuid() }; var query = new Mock <IQuery>(); var command = new Mock <ICommand>(); command.Setup(p => p.UpsertItemEntityAsync <VisitItemEntity>(It.IsAny <VisitItemEntity>())).ReturnsAsync((int)statusCode); var service = new ExpanderService(settings.Object, query.Object, command.Object); var payload = new ExpanderResponse() { EntityId = Guid.NewGuid(), UrlId = Guid.NewGuid(), DateGenerated = DateTimeOffset.UtcNow, DateUpdated = DateTimeOffset.UtcNow }; var result = await service.UpsertAsync <VisitItemEntity>(payload).ConfigureAwait(false); result.Should().Be((int)statusCode); }
/// <inheritdoc/> public async Task <int> UpsertAsync <T>(ExpanderResponse payload) where T : ItemEntity { if (payload == null) { throw new ArgumentNullException(nameof(payload)); } var item = (T)Activator.CreateInstance(typeof(T), payload); var result = await this._command.UpsertItemEntityAsync <T>(item).ConfigureAwait(false); return(result); }
public async Task Given_Request_When_ExpandAsync_Invoked_Then_It_Should_Return_Result(string original, string shortUrl, string title, string description, string owner, params string[] coOwners) { var shortener = new Mock <IShortenerService>(); var shortened = $"https://dvrl.kr/{(string.IsNullOrWhiteSpace(shortUrl) ? "helloworld" : shortUrl)}"; var response = new ExpanderResponse() { Original = new Uri(original), Shortened = new Uri(shortened), ShortUrl = shortUrl, Title = title, Description = description, Owner = owner, CoOwners = coOwners.ToList() }; var expander = new Mock <IExpanderService>(); expander.Setup(p => p.ExpandAsync(It.IsAny <ExpanderRequest>())).ReturnsAsync(response); var request = new ExpanderRequest(); var url = new Url(shortener.Object, expander.Object); typeof(Url).GetProperty("ExpanderRequest", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, request); var result = await url.ExpandAsync() .ConfigureAwait(false); result.Should().BeOfType <Url>() .And.BeAssignableTo <IUrl>(); result.ExpanderResponse.Should().NotBeNull(); result.ExpanderResponse.Original.ToString().TrimEnd('/').Should().Be(original.TrimEnd('/')); result.ExpanderResponse.Shortened.ToString().TrimEnd('/').Should().Be(shortened.TrimEnd('/')); result.ExpanderResponse.ShortUrl.Should().Be(shortUrl); result.ExpanderResponse.Title.Should().Be(title); result.ExpanderResponse.Description.Should().Be(description); result.ExpanderResponse.Owner.Should().Be(owner); result.ExpanderResponse.CoOwners.Should().BeEquivalentTo(coOwners); url.Original.ToString().TrimEnd('/').Should().Be(original.TrimEnd('/')); url.Shortened.ToString().TrimEnd('/').Should().Be(shortened.TrimEnd('/')); url.ShortUrl.Should().Be(shortUrl); url.Title.Should().Be(title); url.Description.Should().Be(description); url.Owner.Should().Be(owner); url.CoOwners.Should().BeEquivalentTo(coOwners); }
/// <inheritdoc/> public async Task <ExpanderResponse> ExpandAsync(ExpanderRequest payload) { if (payload == null) { throw new ArgumentNullException(nameof(payload)); } var item = await this._query.GetUrlItemEntityAsync(payload.ShortUrl); if (item == null) { return(null); } var response = new ExpanderResponse(item); response.Shortened = new Uri($"https://{this._settings.ShortenUrl.Hostname.TrimEnd('/')}/{item.ShortUrl}"); return(response); }
public void Given_ExpanderResponse_With_Empty_EntityId_When_UpdateRecordAsync_Invoked_Then_It_Should_Throw_Exception() { var utcNow = DateTimeOffset.UtcNow; var entityId = Guid.Empty; var shortener = new Mock <IShortenerService>(); var expander = new Mock <IExpanderService>(); var response = new ExpanderResponse(); response.DateGenerated = utcNow; response.DateUpdated = utcNow; var url = new Url(shortener.Object, expander.Object); typeof(Url).GetProperty("ExpanderResponse", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, response); typeof(Url).GetProperty("DateGenerated", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, utcNow); Func <Task> func = async() => await url.UpdateRecordAsync <ExpanderResponse>(utcNow, entityId) .ConfigureAwait(false); func.Should().Throw <ArgumentException>(); }
public async Task Given_ExpanderResponse_When_AddHitCountAsync_Invoked_Then_It_Should_Return_Result(int hitCount) { var shortener = new Mock <IShortenerService>(); var expander = new Mock <IExpanderService>(); var response = new ExpanderResponse() { HitCount = hitCount }; var url = new Url(shortener.Object, expander.Object); typeof(Url).GetProperty("ExpanderResponse", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, response); typeof(Url).GetProperty("HitCount", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, hitCount); var result = await url.AddHitCountAsync <ExpanderResponse>().ConfigureAwait(false); result.Should().BeOfType <Url>() .And.BeAssignableTo <IUrl>(); url.HitCount.Should().Be(hitCount + 1); url.ExpanderResponse.HitCount.Should().Be(hitCount + 1); }
public async Task Given_Request_When_RedirectUrl_Invoked_Then_It_Should_Return_Result(string original, string hostname, string shortUrl, string title, string description, string owner, string coOwners) { if (string.IsNullOrWhiteSpace(shortUrl)) { shortUrl = "loremipsum"; } var now = DateTimeOffset.UtcNow; var shortened = $"https://{hostname}/{shortUrl}"; var owners = coOwners.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList(); var response = new ExpanderResponse() { Original = new Uri(original), Shortened = new Uri(shortened), ShortUrl = shortUrl, Title = title, Description = description, Owner = owner, CoOwners = owners, DateGenerated = now, DateUpdated = now }; var settings = this._mocker.CreateAppSettingsInstance(); settings.SetupGet(p => p.FilesToBeIgnired).Returns(new List <string>()); var url = new Mock <IUrl>(); url.SetupGet(p => p.ExpanderResponse).Returns(response); url.SetupGet(p => p.Original).Returns(response.Original); url.Setup(p => p.GetRequestAsync(It.IsAny <HttpRequest>(), It.IsAny <string>())).ReturnsAsync(url.Object); url.Setup(p => p.ExpandAsync()).ReturnsAsync(url.Object); url.Setup(p => p.AddHitCountAsync <ExpanderResponse>()).ReturnsAsync(url.Object); url.Setup(p => p.UpdateRecordAsync <ExpanderResponse>(It.IsAny <DateTimeOffset>(), It.IsAny <Guid?>())).ReturnsAsync(url.Object); var trigger = new RedirectUrlHttpTrigger(settings.Object, url.Object); var requestId = Guid.NewGuid(); var items = new Dictionary <object, object>() { { "MS_AzureFunctionsRequestID", requestId.ToString() } }; var httpContext = new Mock <HttpContext>(); httpContext.SetupGet(p => p.Items).Returns(items); var host = new HostString(hostname); var req = new Mock <HttpRequest>(); req.SetupGet(p => p.HttpContext).Returns(httpContext.Object); req.SetupGet(p => p.IsHttps).Returns(true); req.SetupGet(p => p.Host).Returns(host); var assemblyLocation = Assembly.GetAssembly(this.GetType()).Location; var segments = assemblyLocation.Split(Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries); var funcAppDirectory = $"{Path.DirectorySeparatorChar}{string.Join(Path.DirectorySeparatorChar, segments.Take(segments.Count()-1))}"; var executionContext = new ExecutionContext() { FunctionAppDirectory = funcAppDirectory }; var log = new Mock <ILogger>(); var result = await trigger.RedirectUrl(req.Object, shortUrl, executionContext, log.Object).ConfigureAwait(false); result.Should().BeOfType <ContentResult>(); (result as ContentResult).Content.Should().NotContain("{{REDIRECT_URL}}"); (result as ContentResult).ContentType.Should().Be("text/html"); (result as ContentResult).StatusCode.Should().Be(200); }