public void Given_Type_When_Instantiated_Then_It_Should_Return_Result() { var entity = new ShortenerResponse(); entity.CoOwners.Should().NotBeNull() .And.HaveCount(0); }
public async Task Given_ShortenerResponse_When_UpdateRecordAsync_Invoked_Then_It_Should_Return_Result() { var utcNow = DateTimeOffset.UtcNow; var shortener = new Mock <IShortenerService>(); var expander = new Mock <IExpanderService>(); var response = new ShortenerResponse(); response.DateGenerated = utcNow; response.DateUpdated = utcNow; var url = new Url(shortener.Object, expander.Object); typeof(Url).GetProperty("ShortenerResponse", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, response); typeof(Url).GetProperty("DateGenerated", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, utcNow); var result = await url.UpdateRecordAsync <ShortenerResponse>(utcNow) .ConfigureAwait(false); result.Should().BeOfType <Url>() .And.BeAssignableTo <IUrl>(); url.DateGenerated.Should().Be(utcNow); url.DateUpdated.Should().Be(utcNow); }
public async Task Given_Request_When_ShortenUrl_Invoked_Then_It_Should_Return_Result(string original, string shortUrl, string title, string description, string owner, string coOwners) { if (string.IsNullOrWhiteSpace(shortUrl)) { shortUrl = "loremipsum"; } var now = DateTimeOffset.UtcNow; var shortened = $"https://dvrl.kr/{shortUrl}"; var owners = coOwners.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList(); var response = new ShortenerResponse() { 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(); var url = new Mock <IUrl>(); url.SetupGet(p => p.ShortenerResponse).Returns(response); url.Setup(p => p.GetRequestAsync(It.IsAny <HttpRequest>())).ReturnsAsync(url.Object); url.Setup(p => p.ValidateAsync()).ReturnsAsync(url.Object); url.Setup(p => p.ShortenAsync()).ReturnsAsync(url.Object); url.Setup(p => p.CreateRecordAsync(It.IsAny <DateTimeOffset>(), It.IsAny <Guid>())).ReturnsAsync(url.Object); var trigger = new ShortenUrlHttpTrigger(settings.Object, url.Object); var req = new Mock <HttpRequest>(); req.SetupGet(p => p.IsHttps).Returns(true); var log = new Mock <ILogger>(); var result = await trigger.ShortenUrl(req.Object, log.Object).ConfigureAwait(false); result.Should().BeOfType <OkObjectResult>(); (result as OkObjectResult).Value.Should().BeOfType <ShortenerResponse>(); ((result as OkObjectResult).Value as ShortenerResponse).Original.Should().Be(original); ((result as OkObjectResult).Value as ShortenerResponse).Shortened.Should().Be(shortened); ((result as OkObjectResult).Value as ShortenerResponse).ShortUrl.Should().Be(shortUrl); ((result as OkObjectResult).Value as ShortenerResponse).Title.Should().Be(title); ((result as OkObjectResult).Value as ShortenerResponse).Description.Should().Be(description); ((result as OkObjectResult).Value as ShortenerResponse).Owner.Should().Be(owner); ((result as OkObjectResult).Value as ShortenerResponse).CoOwners.Should().HaveCount(owners.Count); ((result as OkObjectResult).Value as ShortenerResponse).DateGenerated.Should().Be(now); ((result as OkObjectResult).Value as ShortenerResponse).DateUpdated.Should().Be(now); ((result as OkObjectResult).Value as ShortenerResponse).HitCount.Should().Be(0); }
/// <inheritdoc/> public async Task <int> UpsertAsync(ShortenerResponse payload) { if (payload == null) { throw new ArgumentNullException(nameof(payload)); } var item = new UrlItemEntity(payload); var result = await this._command.UpsertItemEntityAsync <UrlItemEntity>(item).ConfigureAwait(false); return(result); }
public async Task Given_Request_When_ShortenAsync_Invoked_Then_It_Should_Return_Result(string original, string shortUrl, string title, string description, string owner, params string[] coOwners) { var shortened = $"https://dvrl.kr/{(string.IsNullOrWhiteSpace(shortUrl) ? "helloworld" : shortUrl)}"; var response = new ShortenerResponse() { Original = new Uri(original), Shortened = new Uri(shortened), ShortUrl = shortUrl, Title = title, Description = description, Owner = owner, CoOwners = coOwners.ToList() }; var shortener = new Mock <IShortenerService>(); shortener.Setup(p => p.ShortenAsync(It.IsAny <ShortenerRequest>())).ReturnsAsync(response); shortener.SetupSequence(p => p.ExistsAsync(It.IsAny <string>())) .ReturnsAsync(true) .ReturnsAsync(false); var expander = new Mock <IExpanderService>(); var request = new ShortenerRequest(); var url = new Url(shortener.Object, expander.Object); typeof(Url).GetProperty("ShortenerRequest", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, request); var result = await url.ShortenAsync() .ConfigureAwait(false); result.Should().BeOfType <Url>() .And.BeAssignableTo <IUrl>(); result.ShortenerResponse.Original.ToString().TrimEnd('/').Should().Be(original.TrimEnd('/')); result.ShortenerResponse.Shortened.ToString().TrimEnd('/').Should().Be(shortened.TrimEnd('/')); result.ShortenerResponse.ShortUrl.Should().Be(shortUrl); result.ShortenerResponse.Title.Should().Be(title); result.ShortenerResponse.Description.Should().Be(description); result.ShortenerResponse.Owner.Should().Be(owner); result.ShortenerResponse.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 <ShortenerResponse> ShortenAsync(ShortenerRequest payload) { if (payload == null) { throw new ArgumentNullException(nameof(payload)); } var response = new ShortenerResponse() { Original = payload.Original, Title = payload.Title, Description = payload.Description, Owner = payload.Owner, CoOwners = payload.CoOwners, }; if (!string.IsNullOrWhiteSpace(payload.Friendly)) { response.Shortened = new Uri($"https://{this._settings.ShortenUrl.Hostname}/{payload.Friendly}"); response.ShortUrl = payload.Friendly; return(await Task.FromResult(response).ConfigureAwait(false)); } var sb = new StringBuilder(); for (var i = 0; i < this._settings.ShortenUrl.Length; i++) { var index = random.Next(this._settings.ShortenUrl.Length); sb.Append(CharacterPool[index]); } response.Shortened = new Uri($"https://{this._settings.ShortenUrl.Hostname}/{sb.ToString()}"); response.ShortUrl = sb.ToString(); return(await Task.FromResult(response).ConfigureAwait(false)); }
public async Task Given_ShortUrl_When_UpsertAsync_Invoked_Then_It_Should_Return_Result(HttpStatusCode statusCode) { var settings = this._mocker.CreateAppSettingsInstance(); var item = new UrlItemEntity(); var query = new Mock <IQuery>(); var command = new Mock <ICommand>(); command.Setup(p => p.UpsertItemEntityAsync <UrlItemEntity>(It.IsAny <UrlItemEntity>())).ReturnsAsync((int)statusCode); var service = new ShortenerService(settings.Object, query.Object, command.Object); var payload = new ShortenerResponse() { EntityId = Guid.NewGuid(), DateGenerated = DateTimeOffset.UtcNow, DateUpdated = DateTimeOffset.UtcNow }; var result = await service.UpsertAsync(payload).ConfigureAwait(false); result.Should().Be((int)statusCode); }
public async Task Given_ShortenerResponse_When_AddHitCountAsync_Invoked_Then_It_Should_Return_Result(int hitCount) { var shortener = new Mock <IShortenerService>(); var expander = new Mock <IExpanderService>(); var response = new ShortenerResponse() { HitCount = hitCount }; var url = new Url(shortener.Object, expander.Object); typeof(Url).GetProperty("ShortenerResponse", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, response); typeof(Url).GetProperty("HitCount", BindingFlags.Public | BindingFlags.Instance) .SetValue(url, hitCount); var result = await url.AddHitCountAsync <ShortenerResponse>().ConfigureAwait(false); result.Should().BeOfType <Url>() .And.BeAssignableTo <IUrl>(); url.HitCount.Should().Be(hitCount + 1); url.ShortenerResponse.HitCount.Should().Be(hitCount + 1); }