public void ListContainsThreeFragments()
                                {
                                    MethodToTest(() => service.Split(A <TextFragmentResource> .Ignored, A <MembershipRuleTermDefinition> .Ignored));

                                    var fragment = new TextFragmentResource
                                    {
                                        Text        = "some rule or other for a term and another one",
                                        IsPlainText = true
                                    };
                                    var term = new MembershipRuleTermDefinition
                                    {
                                        Term = "A Term",
                                        Id   = 687
                                    };

                                    var result = service.Split(fragment, term);

                                    Assert.AreEqual(3, result.Count);
                                    Assert.AreEqual("some rule or other for ", result.First().Text);
                                    Assert.IsTrue(result[0].IsPlainText);
                                    Assert.AreEqual(term.Term, result[1].Text);
                                    Assert.AreEqual(term.Id, result[1].TermId);
                                    Assert.IsFalse(result[1].IsPlainText);
                                    Assert.AreEqual(" and another one", result[2].Text);
                                    Assert.IsTrue(result[2].IsPlainText);
                                }
        public virtual CreateTermDefinitionResponse CreateTermDefinition(IPrincipal principal, CreateTermDefinitionRequest request)
        {
            var user         = _dependencies.UserService.GetGuaranteedAuthenticatedUser(principal);
            var organisation = _dependencies.OrganisationService.GetOrganisation(request.OrganisationId);

            _dependencies.OrganisationService.GuaranteeUserHasPermission(user, organisation, ShurahOrganisationPermission.EditMembershipRules);

            if (organisation.Terms.Any(t => t.Term == request.Term))
            {
                return(new CreateTermDefinitionResponse
                {
                    HasError = true,
                    Error = "This term already exists"
                });
            }
            var defn = new MembershipRuleTermDefinition();

            defn.Term           = request.Term;
            defn.Definition     = request.Definition;
            defn.Organisation   = organisation;
            defn.OrganisationId = request.OrganisationId;
            _dependencies.StorageService.SetOf <MembershipRuleTermDefinition>().Add(defn);
            _dependencies.StorageService.SaveChanges();
            return(new CreateTermDefinitionResponse
            {
                Id = defn.Id,
                Term = defn.Term
            });
        }
                        public void BuildsAFragmentListBySplittingWithTheTerm()
                        {
                            MethodToTest(() => service.ApplyTerm(A <List <TextFragmentResource> > .Ignored, A <MembershipRuleTermDefinition> .Ignored));

                            var fragments = new List <TextFragmentResource>();
                            var term      = new MembershipRuleTermDefinition();

                            var exampleFragment             = new TextFragmentResource();
                            var exampleReturnedFragmentList = new List <TextFragmentResource>();

                            A.CallTo(() => service.Split(exampleFragment, term)).Returns(exampleReturnedFragmentList);

                            var fragmentsAfterSplit = new List <TextFragmentResource>();

                            A.CallTo(() => dependencies.LinqService.SelectMany(fragments,
                                                                               A <Func <TextFragmentResource, IEnumerable <TextFragmentResource> > > .That.Matches(x =>
                                                                                                                                                                   x.Invoke(exampleFragment) == exampleReturnedFragmentList
                                                                                                                                                                   ))).Returns(fragmentsAfterSplit);
                            var fragmentsAfterSplitList = new List <TextFragmentResource>();

                            A.CallTo(() => dependencies.LinqService.EnumerableToList(fragmentsAfterSplit))
                            .Returns(fragmentsAfterSplitList);

                            var result = service.ApplyTerm(fragments, term);

                            Assert.AreSame(fragmentsAfterSplitList, result);
                        }
 public virtual TermResource BuildTermResource(MembershipRuleTermDefinition termDefinition)
 {
     return(new TermResource
     {
         Term = termDefinition.Term,
         TermId = termDefinition.Id,
     });
 }
                            public void ListContainsTheOriginalFragmentOnly()
                            {
                                MethodToTest(() => service.Split(A <TextFragmentResource> .Ignored, A <MembershipRuleTermDefinition> .Ignored));

                                var fragment = new TextFragmentResource
                                {
                                    IsPlainText = false
                                };
                                var term = new MembershipRuleTermDefinition();

                                var result = service.Split(fragment, term);

                                Assert.AreEqual(1, result.Count);
                                Assert.AreSame(fragment, result.First());
                            }
        public virtual List <TextFragmentResource> Split(TextFragmentResource fragment, MembershipRuleTermDefinition term)
        {
            if (!fragment.IsPlainText)
            {
                return(new List <TextFragmentResource> {
                    fragment
                });
            }
            var indexOfMatch = fragment.Text.ToLower().IndexOf(term.Term.ToLower(), StringComparison.Ordinal);

            if (indexOfMatch == -1)
            {
                return(new List <TextFragmentResource> {
                    fragment
                });
            }

            var results    = new List <TextFragmentResource>();
            var textBefore = fragment.Text.Substring(0, indexOfMatch);

            if (textBefore != string.Empty)
            {
                results.Add(new TextFragmentResource
                {
                    IsPlainText = true,
                    Text        = textBefore
                });
            }
            results.Add(new TextFragmentResource
            {
                IsPlainText = false,
                IsTerm      = true,
                Text        = term.Term,
                TermSlug    = _dependencies.UrlSlugService.GetSlug(term.Term),
                TermId      = term.Id
            });
            var textAfter = fragment.Text.Substring(indexOfMatch + term.Term.Length);

            if (textAfter != string.Empty)
            {
                results.Add(new TextFragmentResource
                {
                    IsPlainText = true,
                    Text        = textAfter
                });
            }
            return(results);
        }
 public virtual List <TextFragmentResource> ApplyTerm(List <TextFragmentResource> fragments, MembershipRuleTermDefinition term)
 {
     return(_dependencies.LinqService.EnumerableToList(
                _dependencies.LinqService.SelectMany(fragments, f => Split(f, term))));
 }