public void Items_without_pageid_are_not_affected_by_filtering() { MockPlug.Setup(_authUri).Verb("POST").ExpectCalls(Times.Never()); var items = new[] { Result(1, null), Result(2, null), }; var set = LuceneResultFilter.Filter(_authPlug, items, 0, int.MaxValue, new Result <IList <LuceneResult> >()).Wait(); Assert.AreEqual(2, set.Count); Assert.AreEqual(items[0], set[0]); MockPlug.VerifyAll(1.Seconds()); }
public void Can_apply_limit() { MockPlug.Setup(_authUri) .Verb("POST") .Returns(DreamMessage.Ok(MimeType.TEXT, "")); var items = new[] { Result(1), Result(2), }; var set = LuceneResultFilter.Filter(_authPlug, items, 0, 1, new Result <IList <LuceneResult> >()).Wait(); Assert.AreEqual(1, set.Count); Assert.AreEqual(items[0], set[0]); }
public void Limit_smaller_than_item_set_forces_authorization_in_chunks_as_candidates_nears_limit() { var items = new List <LuceneResult>(); for (var i = 1; i <= 200; i++) { items.Add(Result(i)); } // first chunk should ask for 50 ids and we'll filter 20 from that set MockPlug.Setup(_authUri) .Verb("POST") .WithMessage(m => { var t = m.ToText(); var match = t.EqualsInvariant(items.Select(x => x.PageId.Value).Take(50).ToCommaDelimitedString()); _log.DebugFormat("first chunk match? {0} => {1}", match, t); return(match); }) .Returns(DreamMessage.Ok(MimeType.TEXT, S(10, 39).ToCommaDelimitedString())) .ExpectCalls(Times.Once()); // second chunk should ask for 30 and we'll filter 5 from that set // which gives it a total larger than our limit, i.e. it won't try for a third chunk MockPlug.Setup(_authUri) .Verb("POST") .WithMessage(m => { var t = m.ToText(); var match = t.EqualsInvariant(items.Select(x => x.PageId.Value).Skip(50).Take(30).ToCommaDelimitedString()); _log.DebugFormat("second chunk match? {0} => {1}", match, t); return(match); }) .Returns(DreamMessage.Ok(MimeType.TEXT, S(51, 55).ToCommaDelimitedString())) .ExpectCalls(Times.Once()); var builder = new LuceneResultFilter(_authPlug, 10000, 20); var set = Coroutine.Invoke(builder.Filter, items, 0, 30, new Result <IList <LuceneResult> >()).Wait(); Assert.AreEqual(30, set.Count); // we expect a sequence of 1-9,40-50,56-... and take the first 30 var expected = S(1, 9).Union(S(40, 50)).Union(S(56, 100)).Take(30); Assert.AreEqual( expected.ToCommaDelimitedString(), set.Select(x => x.PageId.Value).ToCommaDelimitedString() ); MockPlug.VerifyAll(1.Seconds()); }
public void Items_are_filtered_by_pageId() { MockPlug.Setup(_authUri) .Verb("POST") .WithMessage(m => { var t = m.ToText(); return(t.EqualsInvariant("1,2")); }) .Returns(DreamMessage.Ok(MimeType.TEXT, "1")) .ExpectCalls(Times.Once()); var items = new[] { Result(1), Result(2), }; var set = LuceneResultFilter.Filter(_authPlug, items, 0, int.MaxValue, new Result <IList <LuceneResult> >()).Wait(); Assert.AreEqual(1, set.Count); Assert.AreEqual(items[1], set[0]); MockPlug.VerifyAll(1.Seconds()); }
public void Item_sets_larger_than_maxAuthItems_are_authorized_in_chunks() { var items = new List <LuceneResult>(); for (var i = 1; i <= 50; i++) { items.Add(Result(i)); } MockPlug.Setup(_authUri) .Verb("POST") .WithMessage(m => { var t = m.ToText(); var match = t.EqualsInvariant(items.Select(x => x.PageId.Value).Take(30).ToCommaDelimitedString()); _log.DebugFormat("first chunk match? {0} => {1}", match, t); return(match); }) .Returns(DreamMessage.Ok(MimeType.TEXT, "")) .ExpectCalls(Times.Once()); MockPlug.Setup(_authUri) .Verb("POST") .WithMessage(m => { var t = m.ToText(); var match = t.EqualsInvariant(items.Select(x => x.PageId.Value).Skip(30).ToCommaDelimitedString()); _log.DebugFormat("second chunk match? {0} => {1}", match, t); return(match); }) .Returns(DreamMessage.Ok(MimeType.TEXT, "")) .ExpectCalls(Times.Once()); var builder = new LuceneResultFilter(_authPlug, 30, 1000); var set = Coroutine.Invoke(builder.Filter, items, 0, int.MaxValue, new Result <IList <LuceneResult> >()).Wait(); Assert.AreEqual(items.Count, set.Count); Assert.AreEqual( items.Select(x => x.PageId.Value).ToCommaDelimitedString(), set.Select(x => x.PageId.Value).ToCommaDelimitedString() ); MockPlug.VerifyAll(1.Seconds()); }