public async Task LinqToCargoDateTimeTest2(double backtrackDays) { var site = await GetWikiSiteAsync(Endpoints.LolEsportsWiki); var cqContext = new LolCargoQueryContext(site); var q = cqContext.Skins .OrderBy(s => s.ReleaseDate) .Where(s => CargoFunctions.DateDiff(s.ReleaseDate, DateTime.Now - TimeSpan.FromDays(backtrackDays)) >= 0) .Take(10); // Call .AsAsyncEnumerable to ensure we use async Linq call. var records = await q.AsAsyncEnumerable().ToListAsync(); ShallowTrace(records, 3); // Left some buffer as server time may deviate from the client time. var expectedMinReleaseDate = DateTime.UtcNow - TimeSpan.FromDays(backtrackDays + 1); Output.WriteLine("expectedMinReleaseDate = {0:O}", expectedMinReleaseDate); Assert.All(records, r => Assert.True(r.ReleaseDate == null || r.ReleaseDate > expectedMinReleaseDate)); }
public async Task LinqToCargoDateTimeTest3() { var site = await GetWikiSiteAsync(Endpoints.LolEsportsWiki); var cqContext = new LolCargoQueryContext(site); // Cargo build on lolwiki does not support `&&` very well for now. var q = from s in cqContext.Skins where CargoFunctions.Holds(s.Artists, "David Villegas") || CargoFunctions.HoldsLike(s.Artists, "% Studio") where s.ReleaseDate >= new DateTime(2020, 1, 1) && s.ReleaseDate <= new DateTime(2021, 1, 1) orderby s.ReleaseDate descending // HACK projection Artists = s.Artists works here as by default we use (,) as delimiter. // TODO pass through CargoCollectionAttribute to ProjectionExpression. select new { s.Page, s.Name, s.Artists, s.ReleaseDate }; var records = await q.Take(50).AsAsyncEnumerable().ToListAsync(); ShallowTrace(records, 3); Assert.All(records, r => Assert.All(r.Artists, a => Assert.True(a == "David Villegas" || a.EndsWith(" Studio")) ) ); }