moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
$this->breadcrumbManager = new BreadcrumbManager($this->moduleHandler);
$this->breadcrumb = new Breadcrumb();
$this->container = new ContainerBuilder();
$cache_contexts_manager = $this->prophesize(CacheContextsManager::class);
$cache_contexts_manager->assertValidTokens()->willReturn(TRUE);
$cache_contexts_manager->reveal();
$this->container->set('cache_contexts_manager', $cache_contexts_manager);
\Drupal::setContainer($this->container);
}
/**
* Tests the breadcrumb manager without any set breadcrumb.
*/
public function testBuildWithoutBuilder() {
$route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
$this->moduleHandler->expects($this->once())
->method('alter')
->with('system_breadcrumb', $this->breadcrumb, $route_match, ['builder' => NULL]);
$breadcrumb = $this->breadcrumbManager->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface'));
$this->assertEquals([], $breadcrumb->getLinks());
$this->assertEquals([], $breadcrumb->getCacheContexts());
$this->assertEquals([], $breadcrumb->getCacheTags());
$this->assertEquals(Cache::PERMANENT, $breadcrumb->getCacheMaxAge());
}
/**
* Tests the build method with a single breadcrumb builder.
*/
public function testBuildWithSingleBuilder() {
$builder = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$links = ['Test'];
$this->breadcrumb->setLinks($links);
$this->breadcrumb->addCacheContexts(['foo'])->addCacheTags(['bar']);
$builder->expects($this->once())
->method('applies')
->will($this->returnValue(TRUE));
$builder->expects($this->once())
->method('build')
->willReturn($this->breadcrumb);
$route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
$this->moduleHandler->expects($this->once())
->method('alter')
->with('system_breadcrumb', $this->breadcrumb, $route_match, ['builder' => $builder]);
$this->breadcrumbManager->addBuilder($builder, 0);
$breadcrumb = $this->breadcrumbManager->build($route_match);
$this->assertEquals($links, $breadcrumb->getLinks());
$this->assertEquals(['foo'], $breadcrumb->getCacheContexts());
$this->assertEquals(['bar'], $breadcrumb->getCacheTags());
$this->assertEquals(Cache::PERMANENT, $breadcrumb->getCacheMaxAge());
}
/**
* Tests multiple breadcrumb builder with different priority.
*/
public function testBuildWithMultipleApplyingBuilders() {
$builder1 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$builder1->expects($this->never())
->method('applies');
$builder1->expects($this->never())
->method('build');
$builder2 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$links2 = ['Test2'];
$this->breadcrumb->setLinks($links2);
$this->breadcrumb->addCacheContexts(['baz'])->addCacheTags(['qux']);
$builder2->expects($this->once())
->method('applies')
->will($this->returnValue(TRUE));
$builder2->expects($this->once())
->method('build')
->willReturn($this->breadcrumb);
$route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
$this->moduleHandler->expects($this->once())
->method('alter')
->with('system_breadcrumb', $this->breadcrumb, $route_match, ['builder' => $builder2]);
$this->breadcrumbManager->addBuilder($builder1, 0);
$this->breadcrumbManager->addBuilder($builder2, 10);
$breadcrumb = $this->breadcrumbManager->build($route_match);
$this->assertEquals($links2, $breadcrumb->getLinks());
$this->assertEquals(['baz'], $breadcrumb->getCacheContexts());
$this->assertEquals(['qux'], $breadcrumb->getCacheTags());
$this->assertEquals(Cache::PERMANENT, $breadcrumb->getCacheMaxAge());
}
/**
* Tests multiple breadcrumb builders of which one returns NULL.
*/
public function testBuildWithOneNotApplyingBuilders() {
$builder1 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$builder1->expects($this->once())
->method('applies')
->will($this->returnValue(FALSE));
$builder1->expects($this->never())
->method('build');
$builder2 = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$links2 = ['Test2'];
$this->breadcrumb->setLinks($links2);
$this->breadcrumb->addCacheContexts(['baz'])->addCacheTags(['qux']);
$builder2->expects($this->once())
->method('applies')
->will($this->returnValue(TRUE));
$builder2->expects($this->once())
->method('build')
->willReturn($this->breadcrumb);
$route_match = $this->getMock('Drupal\Core\Routing\RouteMatchInterface');
$this->moduleHandler->expects($this->once())
->method('alter')
->with('system_breadcrumb', $this->breadcrumb, $route_match, ['builder' => $builder2]);
$this->breadcrumbManager->addBuilder($builder1, 10);
$this->breadcrumbManager->addBuilder($builder2, 0);
$breadcrumb = $this->breadcrumbManager->build($route_match);
$this->assertEquals($links2, $breadcrumb->getLinks());
$this->assertEquals(['baz'], $breadcrumb->getCacheContexts());
$this->assertEquals(['qux'], $breadcrumb->getCacheTags());
$this->assertEquals(Cache::PERMANENT, $breadcrumb->getCacheMaxAge());
}
/**
* Tests a breadcrumb builder with a bad return value.
*/
public function testBuildWithInvalidBreadcrumbResult() {
$builder = $this->getMock('Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface');
$builder->expects($this->once())
->method('applies')
->will($this->returnValue(TRUE));
$builder->expects($this->once())
->method('build')
->will($this->returnValue('invalid_result'));
$this->breadcrumbManager->addBuilder($builder, 0);
$this->setExpectedException(\UnexpectedValueException::class);
$this->breadcrumbManager->build($this->getMock('Drupal\Core\Routing\RouteMatchInterface'));
}
}