Example #1
0
        public async Task <TrimUriModel> TrimUrlAsync(
            string address
            )
        {
            if (address == null)
            {
                throw new ArgumentException();
            }
            address = address.Trim();
            if (string.IsNullOrEmpty(address))
            {
                throw new ArgumentException();
            }
            address = address.ToLower();
            if (!Uri.TryCreate(address, UriKind.Absolute, out Uri uriResult))
            {
                throw new ArgumentException();
            }
            var result = new TrimUriModel(address);
            var find   = await DbContext
                         .TrimUrls
                         .Where(x => x.Address == address)
                         .FirstOrDefaultAsync();

            if (find != null)
            {
                result.Trimmed = UriPrefix + find.HashCode;
                return(result);
            }
            var key = "";

            do
            {
                key = HasherService.Generate(UriSuffixLength);
                var conflict = await DbContext
                               .TrimUrls
                               .AnyAsync(x => x.HashCode.ToLower() == key);

                if (!conflict)
                {
                    break;
                }
            }while (true);
            var append = new TrimUrlEntity
            {
                Address  = address,
                HashCode = key,
            };

            DbContext.TrimUrls.Add(append);
            await DbContext.SaveChangesAsync();

            result.Trimmed = UriPrefix + key;
            return(result);
        }
        public async Task ValidInputsTests()
        {
            // arrange
            var generator = new GeneratorService();

            using (var scope = new TestScope())
                using (var context = scope.ConnectDb())
                    using (
                        var instance = new TrimmerService(
                            context,
                            generator,
                            scope.Config
                            )
                        )
                    {
                        // act
                        var urls = new List <string>();
                        foreach (var key in ValidInputs)
                        {
                            var val = await instance
                                      .TrimUrlAsync(key);

                            urls.Add(val.Print());
                        }
                        var list = await context
                                   .TrimUrls
                                   .ToListAsync();

                        var cast = list.Select(i =>
                        {
                            var j = new TrimUriModel(
                                i.Address,
                                instance.UriPrefix + i.HashCode
                                );
                            return(j.Print());
                        }).ToList();
                        var match = Enumerable.SequenceEqual(urls, cast);
                        // assert
                        Assert.True(match);
                    }
        }