@Test public void test_construction_ThrowsAnException_WhenANullContainerIsSpecified() { try { new ComponentFinder(null, null); fail(); } catch (IllegalArgumentException iae) { assertEquals("A container must be specified.", iae.getMessage()); } }
@Test public void test_construction_ThrowsAnException_WhenANullPackageNameIsSpecified() { try { Container container = model.addSoftwareSystem("Software System", "").addContainer("Container", "", ""); new ComponentFinder(container, null); fail(); } catch (IllegalArgumentException iae) { assertEquals("A package name must be specified.", iae.getMessage()); } }
@Test public void test_construction_ThrowsAnException_WhenNoComponentFinderStrategiesAreSpecified() { try { Container container = model.addSoftwareSystem("Software System", "").addContainer("Container", "", ""); new ComponentFinder(container, "com.mycompany.myapp"); fail(); } catch (IllegalArgumentException iae) { assertEquals("One or more ComponentFinderStrategy objects must be specified.", iae.getMessage()); } }
@Test public void test_findComponents_TruncatesComponentDescriptions_WhenComponentDescriptionsAreTooLong() throws Exception { ComponentFinder componentFinder = new ComponentFinder( webApplication, "test.SourceCodeComponentFinderStrategy", new SourceCodeComponentFinderStrategy(sourcePath, 10) ); componentFinder.findComponents(); assertEquals("A compo...", someComponent.getDescription()); }
@Test public void test_findComponents_DoesNotSetTheComponentDescription_WhenTheComponentAlreadyHasADescription() throws Exception { someComponent.setDescription("An existing description."); ComponentFinder componentFinder = new ComponentFinder( webApplication, "test.SourceCodeComponentFinderStrategy", new SourceCodeComponentFinderStrategy(sourcePath, 10) ); componentFinder.findComponents(); assertEquals("An existing description.", someComponent.getDescription()); }
@Test public void test_addPackageName_ThrowsAnException_WhenAnEmptyPackageNameIsSpecified() { try { Container container = model.addSoftwareSystem("Software System", "").addContainer("Container", "", ""); ComponentFinder componentFinder = new ComponentFinder(container, "com.mycompany.myapp", new TypeMatcherComponentFinderStrategy(new NameSuffixTypeMatcher("Component", "", ""))); componentFinder.addPackageName(" "); fail(); } catch (IllegalArgumentException iae) { assertEquals("A package name must be specified.", iae.getMessage()); } }
@Test public void test_addPackageName_ThrowsAnException_WhenANullPackageNameIsSpecified() { try { Container container = model.addSoftwareSystem("Software System", "").addContainer("Container", "", ""); ComponentFinder componentFinder = new ComponentFinder(container, "com.mycompany.myapp", new TypeMatcherComponentFinderStrategy(new NameSuffixTypeMatcher("Component", "", ""))); componentFinder.addPackageName(null); fail(); } catch (IllegalArgumentException iae) { assertEquals("A package name must be specified.", iae.getMessage()); } }
@Test public void test_findComponents() throws Exception { ComponentFinder componentFinder = new ComponentFinder( webApplication, "test.SourceCodeComponentFinderStrategy", new SourceCodeComponentFinderStrategy(sourcePath) ); componentFinder.findComponents(); assertEquals("A component that does something.", someComponent.getDescription()); assertEquals(20, someComponent.getSize()); }
@Test public void test_findComponents_UsesTheConfiguredDuplicateComponentFinderStrategy() throws Exception { try { SpringComponentFinderStrategy springComponentFinderStrategy = new SpringComponentFinderStrategy(); springComponentFinderStrategy.setDuplicateComponentStrategy(new DuplicateComponentStrategy() { @Override public Component duplicateComponentFound(Component component, String name, String type, String description, String technology) { return null; } }); ComponentFinder componentFinder = new ComponentFinder( webApplication, "com.structurizr.analysis.myapp", springComponentFinderStrategy ); componentFinder.findComponents(); componentFinder.findComponents(); } catch (DuplicateComponentException dce) { fail(); } }
@Test public void test_findComponents_CorrectlyFindsDependenciesFromSuperclass() throws Exception { ComponentFinder componentFinder = new ComponentFinder( webApplication, "com.structurizr.analysis.reflections.dependenciesFromSuperClass", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Component", "", "") ) ); componentFinder.findComponents(); assertEquals(2, webApplication.getComponents().size()); Component someComponent = webApplication.getComponentWithName("SomeComponent"); assertNotNull(someComponent); assertEquals("SomeComponent", someComponent.getName()); assertEquals("com.structurizr.analysis.reflections.dependenciesFromSuperClass.SomeComponent", someComponent.getType().getType()); Component loggingComponent = webApplication.getComponentWithName("LoggingComponent"); assertNotNull(loggingComponent); assertEquals("LoggingComponent", loggingComponent.getName()); assertEquals("com.structurizr.analysis.reflections.dependenciesFromSuperClass.LoggingComponent", loggingComponent.getType().getType()); assertEquals(1, someComponent.getRelationships().size()); assertNotNull(someComponent.getRelationships().stream().filter(r -> r.getDestination() == loggingComponent).findFirst().get()); }
@Test public void test_findComponents_FindsSpringWebServiceEndpoints() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); Container container = softwareSystem.addContainer("Name", "Description", "Technology"); ComponentFinder componentFinder = new ComponentFinder( container, "test.SpringWebServiceEndpointComponentFinderStrategy", new SpringWebServiceEndpointComponentFinderStrategy() ); componentFinder.findComponents(); assertEquals(1, container.getComponents().size()); Component component = container.getComponentWithName("SomeWebService"); assertEquals("test.SpringWebServiceEndpointComponentFinderStrategy.SomeWebService", component.getType().getType()); assertEquals("", component.getDescription()); assertEquals("Spring Web Service", component.getTechnology()); }
@Test public void test_findComponents_FindsSpringServices() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); Container container = softwareSystem.addContainer("Name", "Description", "Technology"); ComponentFinder componentFinder = new ComponentFinder( container, "test.SpringServiceComponentFinderStrategy", new SpringServiceComponentFinderStrategy() ); componentFinder.findComponents(); assertEquals(1, container.getComponents().size()); Component component = container.getComponentWithName("SomeService"); assertEquals("test.SpringServiceComponentFinderStrategy.SomeService", component.getType().getType()); assertEquals("", component.getDescription()); assertEquals("Spring Service", component.getTechnology()); }
@Test public void test_findComponents_FindsSpringRepositoriesThatExtendCrudRepository() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); Container container = softwareSystem.addContainer("Name", "Description", "Technology"); ComponentFinder componentFinder = new ComponentFinder( container, "test.SpringRepositoryComponentFinderStrategy.crudRepository", new SpringRepositoryComponentFinderStrategy() ); componentFinder.findComponents(); assertEquals(1, container.getComponents().size()); Component component = container.getComponentWithName("SomeCrudRepository"); assertEquals("test.SpringRepositoryComponentFinderStrategy.crudRepository.SomeCrudRepository", component.getType().getType()); assertEquals("", component.getDescription()); assertEquals("Spring Repository", component.getTechnology()); }
@Test public void test_findComponents_FindsSpringRepositoriesThatExtendJpaRepository() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); Container container = softwareSystem.addContainer("Name", "Description", "Technology"); ComponentFinder componentFinder = new ComponentFinder( container, "test.SpringRepositoryComponentFinderStrategy.jpaRepository", new SpringRepositoryComponentFinderStrategy() ); componentFinder.findComponents(); assertEquals(1, container.getComponents().size()); Component component = container.getComponentWithName("SomeJpaRepository"); assertEquals("test.SpringRepositoryComponentFinderStrategy.jpaRepository.SomeJpaRepository", component.getType().getType()); assertEquals("", component.getDescription()); assertEquals("Spring Repository", component.getTechnology()); }
@Test public void test_findComponents_FindsSpringRestControllers() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); Container container = softwareSystem.addContainer("Name", "Description", "Technology"); ComponentFinder componentFinder = new ComponentFinder( container, "test.SpringRestControllerComponentFinderStrategy", new SpringRestControllerComponentFinderStrategy() ); componentFinder.findComponents(); assertEquals(1, container.getComponents().size()); Component component = container.getComponentWithName("SomeController"); assertEquals("test.SpringRestControllerComponentFinderStrategy.SomeController", component.getType().getType()); assertEquals("", component.getDescription()); assertEquals("Spring REST Controller", component.getTechnology()); }
@Test public void test_findComponents_IgnoresNonPublicTypesByDefault() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); Container container = softwareSystem.addContainer("Name", "Description", "Technology"); ComponentFinder componentFinder = new ComponentFinder( container, "test.AbstractSpringComponentFinderStrategy", new SpringComponentFinderStrategy() ); componentFinder.findComponents(); assertEquals(2, container.getComponents().size()); Component component = container.getComponentWithName("SomeController"); assertEquals("test.AbstractSpringComponentFinderStrategy.SomeController", component.getType().getType()); component = container.getComponentWithName("SomePublicRepository"); assertEquals("test.AbstractSpringComponentFinderStrategy.SomePublicRepository", component.getType().getType()); }
@Test public void test_findComponents_FindsSpringComponents() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); Container container = softwareSystem.addContainer("Name", "Description", "Technology"); ComponentFinder componentFinder = new ComponentFinder( container, "test.SpringComponentComponentFinderStrategy", new SpringComponentComponentFinderStrategy() ); componentFinder.findComponents(); assertEquals(1, container.getComponents().size()); Component component = container.getComponentWithName("SomeComponent"); assertEquals("test.SpringComponentComponentFinderStrategy.SomeComponent", component.getType().getType()); assertEquals("", component.getDescription()); assertEquals("Spring Component", component.getTechnology()); }
@Test public void test_findComponents_FindsSpringMvcControllers() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); Container container = softwareSystem.addContainer("Name", "Description", "Technology"); ComponentFinder componentFinder = new ComponentFinder( container, "test.SpringMvcControllerComponentFinderStrategy", new SpringMvcControllerComponentFinderStrategy() ); componentFinder.findComponents(); assertEquals(1, container.getComponents().size()); Component component = container.getComponentWithName("SomeController"); assertEquals("test.SpringMvcControllerComponentFinderStrategy.SomeController", component.getType().getType()); assertEquals("", component.getDescription()); assertEquals("Spring MVC Controller", component.getTechnology()); }
@Before public void setUp() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); container = softwareSystem.addContainer("Name", "Description", "Technology"); componentFinder = new ComponentFinder( container, "test.TypeMatcherComponentFinderStrategy", new TypeMatcherComponentFinderStrategy( new NameSuffixTypeMatcher("Controller", "Controller description", "Controller technology"), new NameSuffixTypeMatcher("Repository", "Repository description", "Repository technology") ) ); componentFinder.findComponents(); }
@Test public void test_findComponents_FindsSpringRepositoriesDefinedWithAnAnnotation() throws Exception { Workspace workspace = new Workspace("Name", "Description"); Model model = workspace.getModel(); SoftwareSystem softwareSystem = model.addSoftwareSystem("Name", "Description"); Container container = softwareSystem.addContainer("Name", "Description", "Technology"); ComponentFinder componentFinder = new ComponentFinder( container, "test.SpringRepositoryComponentFinderStrategy.annotation", new SpringRepositoryComponentFinderStrategy() ); componentFinder.findComponents(); // finding the components again should be idempotent componentFinder.findComponents(); assertEquals(1, container.getComponents().size()); Component component = container.getComponentWithName("SomeRepository"); assertEquals("test.SpringRepositoryComponentFinderStrategy.annotation.SomeRepository", component.getType().getType()); assertEquals("", component.getDescription()); assertEquals("Spring Repository", component.getTechnology()); }