Midnighter / structurizr-python

A Python 3 port of Simon Brown's Structurizr diagrams-as-code architecture description tool.
https://structurizr.com/
Apache License 2.0
65 stars 16 forks source link

StaticView.add_nearest_neighbours should not duplicate relationships #63

Open yt-ms opened 3 years ago

yt-ms commented 3 years ago

Problem description

If add_nearest_neighbours() is called more than once for the same element (e.g. with different neighbour types) then it can currently duplicate relationships.

Code Sample

Create a minimal, complete, verifiable example.

from structurizr.model import Model, Person, SoftwareSystem
from structurizr.view.static_view import StaticView

class DerivedView(StaticView):
    """Mock class for testing."""
    def add_all_elements(self) -> None:
        """Stub method because base is abstract."""
        pass

def test_add_nearest_neighbours_doesnt_dupe_relationships():
    """Test relationships aren't duplicated if neighbours added more than once."""
    model = Model()
    sys1 = model.add_software_system(name="System 1")
    sys2 = model.add_software_system(name="System 2")
    sys1.uses(sys2)
    view = DerivedView(software_system=sys1, description="")
    view.add_nearest_neighbours(sys1, SoftwareSystem)
    assert len(view.relationship_views) == 1

    # The next line will currently dupe the relationship
    view.add_nearest_neighbours(sys1, Person)
    assert len(view.relationship_views) == 1  # This fails as it's 2

Context

``` System Information ================== OS Windows OS-release 10 Python 3.7.5 Package Versions ================ depinfo 1.5.4 httpx 0.16.1 importlib_metadata 1.7.0 ordered-set 3.1 pip 20.2.4 pydantic 1.7.1 python-dotenv 0.14.0 setuptools 41.2.0 structurizr-python 0.2.1+29.gf1b13ef.dirty ```