Beispiel #1
0
        /// <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);
        }
Beispiel #3
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);
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        /// <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);
        }
Beispiel #8
0
        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>();
        }
Beispiel #9
0
        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);
        }