Beispiel #1
0
        public void Given_Type_When_Instantiated_Then_It_Should_Return_Result()
        {
            var entity = new ShortenerResponse();

            entity.CoOwners.Should().NotBeNull()
            .And.HaveCount(0);
        }
Beispiel #2
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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        /// <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));
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }