Skip to content
sergeyshushlyapin edited this page Nov 4, 2014 · 4 revisions
[Fact]
public void HowToWorkWithLinkDatabase()
{
  // arrange your database and items
  Sitecore.Data.ID sourceId = Sitecore.Data.ID.NewID;
  Sitecore.Data.ID aliasId = Sitecore.Data.ID.NewID;
  Sitecore.Data.ID linkedItemId = Sitecore.Data.ID.NewID;

  using (Sitecore.FakeDb.Db db = new Sitecore.FakeDb.Db
  {
    new Sitecore.FakeDb.DbItem("source", sourceId),
    new Sitecore.FakeDb.DbItem("clone"),
    new Sitecore.FakeDb.DbItem("alias", aliasId, Sitecore.TemplateIDs.Alias)
    {
      new Sitecore.FakeDb.DbField("Linked item", linkedItemId)
    }
  })
  {
    // arrange desired LinkDatabase behavior
    var behavior = Substitute.For<Sitecore.Links.LinkDatabase>();

    Sitecore.Data.Items.Item source = db.GetItem("/sitecore/content/source");
    Sitecore.Data.Items.Item alias = db.GetItem("/sitecore/content/alias");
    Sitecore.Data.Items.Item clone = db.GetItem("/sitecore/content/clone");

    string sourcePath = source.Paths.FullPath;
    behavior.GetReferrers(source).Returns(new[]
    {
      new Sitecore.Links.ItemLink(alias, linkedItemId, source, sourcePath),
      new Sitecore.Links.ItemLink(clone, Sitecore.FieldIDs.Source, source, sourcePath)
    });

    // link database is clean
    Xunit.Assert.Equal(Sitecore.Globals.LinkDatabase.GetReferrers(source).Count(), 0);

    using (new Sitecore.FakeDb.Links.LinkDatabaseSwitcher(behavior))
    {
      Sitecore.Links.ItemLink[] referrers =
        Sitecore.Globals.LinkDatabase.GetReferrers(source);

      Xunit.Assert.Equal(referrers.Count(), 2);
      Xunit.Assert.Equal(referrers.Count(r => r.SourceItemID == clone.ID
        && r.TargetItemID == source.ID), 1);
      Xunit.Assert.Equal(referrers.Count(r => r.SourceItemID == alias.ID
        && r.TargetItemID == source.ID), 1);
    }

    // link database is clean again
    Xunit.Assert.Equal(Sitecore.Globals.LinkDatabase.GetReferrers(source).Count(), 0);
  }
}
Clone this wiki locally