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); } }