import pytest from compose_viz.compose import Compose from compose_viz.extends import Extends from compose_viz.parser import Parser from compose_viz.service import Service @pytest.mark.parametrize( "test_input, expected", [ ( "tests/in/000001.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], ), ] ), ), ( "tests/in/000010.yaml", Compose( [ Service( name="base", image="busybox", ), Service( name="common", extends=Extends(service_name="frontend"), ), Service( name="cli", extends=Extends(service_name="common"), ), ] ), ), ( "tests/in/000011.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", networks=["admin"], extends=Extends(service_name="frontend"), ), Service( name="backend", networks=["back-tier", "admin"], extends=Extends(service_name="frontend"), ), ] ), ), ( "tests/in/000100.yaml", Compose( [ Service( name="web", image="build from .", ports=["8000:5000"], ), Service( name="redis", image="redis:alpine", ), ] ), ), ( "tests/in/000101.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ports=["8000:5000"], networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", ports=["8000:5001"], networks=["admin"], ), Service( name="backend", image="awesome/backend", ports=["8000:5010"], networks=["back-tier", "admin"], ), ] ), ), ( "tests/in/000110.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ports=["8000:5000"], ), Service( name="monitoring", extends=Extends(service_name="frontend"), ), Service( name="backend", extends=Extends(service_name="frontend"), ports=["8000:5001"], ), ] ), ), ( "tests/in/000111.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ports=["8000:5000"], networks=["front-tier", "back-tier"], ), Service( name="monitoring", networks=["admin"], extends=Extends(service_name="frontend"), ), Service( name="backend", ports=["8000:5001"], networks=["back-tier", "admin"], extends=Extends(service_name="frontend"), ), ] ), ), ( "tests/in/001000.yaml", Compose( [ Service( name="web", image="build from .", depends_on=["db", "redis"], ), Service( name="redis", image="redis", ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/001001.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], depends_on=["monitoring", "backend"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], ), ] ), ), ( "tests/in/001010.yaml", Compose( [ Service( name="web", depends_on=["db", "redis"], extends=Extends(service_name="redis"), ), Service( name="redis", image="redis", ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/001011.yaml", Compose( [ Service( name="frontend", networks=["front-tier", "back-tier"], depends_on=["monitoring", "backend"], extends=Extends(service_name="backend"), ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], ), ] ), ), ( "tests/in/001100.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ports=["8000:5000"], ), Service( name="monitoring", image="awesome/monitoring", depends_on=["backend"], ports=["8000:5010"], ), Service( name="backend", image="awesome/backend", ports=["8000:5001"], ), ] ), ), ( "tests/in/001101.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], depends_on=["backend"], ports=["8000:5010"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], ), ] ), ), ( "tests/in/001110.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ports=["8000:5000"], ), Service( name="monitoring", depends_on=["backend"], extends=Extends(service_name="frontend"), ports=["8000:5010"], ), Service( name="backend", image="awesome/backend", ports=["8000:5001"], ), ] ), ), ( "tests/in/001111.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", networks=["admin"], depends_on=["backend"], extends=Extends(service_name="frontend"), ports=["8000:5010"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], ), ] ), ), ( "tests/in/010000.yaml", Compose( [ Service( name="backend", image="awesome/backend", volumes=["db-data"], ), ] ), ), ( "tests/in/010001.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], volumes=["db-data"], ), ] ), ), ( "tests/in/010010.yaml", Compose( [ Service( name="common", image="busybox", volumes=["common-volume"], ), Service( name="cli", extends=Extends(service_name="common"), volumes=["cli-volume"], ), ] ), ), ( "tests/in/010011.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], volumes=["db-data"], extends=Extends(service_name="monitoring"), ), ] ), ), ( "tests/in/010100.yaml", Compose( [ Service( name="backend", image="awesome/backend", volumes=["db-data"], ports=["8000:5000"], ), ] ), ), ( "tests/in/010101.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], volumes=["db-data"], ports=["8000:5000"], ), ] ), ), ( "tests/in/010110.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", volumes=["db-data"], extends=Extends(service_name="monitoring"), ports=["8000:5000"], ), ] ), ), ( "tests/in/010111.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], volumes=["db-data"], extends=Extends(service_name="monitoring"), ports=["8000:5000"], ), ] ), ), ( "tests/in/011000.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", depends_on=["backend"], volumes=["db-data"], ), Service( name="backend", image="awesome/backend", ), ] ), ), ( "tests/in/011001.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], volumes=["db-data"], depends_on=["monitoring"], ), ] ), ), ( "tests/in/011010.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", volumes=["db-data"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), ), ] ), ), ( "tests/in/011011.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], volumes=["db-data"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), ), ] ), ), ( "tests/in/011100.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", volumes=["db-data"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), ports=["8000:5010"], ), ] ), ), ( "tests/in/011101.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], volumes=["db-data"], depends_on=["monitoring"], ports=["8000:5010"], ), ] ), ), ( "tests/in/011110.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", volumes=["db-data"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), ports=["8000:5010"], ), ] ), ), ( "tests/in/011111.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], volumes=["db-data"], depends_on=["monitoring"], extends=Extends(service_name="monitoring"), ports=["8000:5010"], ), ] ), ), ( "tests/in/100000.yaml", Compose( [ Service( name="web", image="build from .", links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/100001.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/100010.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", extends=Extends(service_name="frontend"), links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/100011.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], extends=Extends(service_name="frontend"), links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/100100.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", image="awesome/backend", ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/100101.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/100110.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", extends=Extends(service_name="frontend"), ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/100111.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], extends=Extends(service_name="frontend"), ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/101000.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", image="awesome/backend", depends_on=["monitoring"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/101001.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], depends_on=["monitoring"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/101010.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", depends_on=["monitoring"], extends=Extends(service_name="frontend"), links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/101011.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/101100.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", image="awesome/backend", depends_on=["monitoring"], ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/101101.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], depends_on=["monitoring"], ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/101110.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", depends_on=["monitoring"], extends=Extends(service_name="frontend"), ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/101111.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/110000.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", volumes=["db-data"], links=["db:database"], ), Service( name="backend", image="awesome/backend", ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/110001.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], volumes=["db-data"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/110010.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", volumes=["db-data"], extends=Extends(service_name="frontend"), links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/110011.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], volumes=["db-data"], extends=Extends(service_name="frontend"), links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/110100.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", image="awesome/backend", volumes=["db-data"], ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/110101.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], volumes=["db-data"], ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/110110.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", volumes=["db-data"], extends=Extends(service_name="frontend"), ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/110111.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], volumes=["db-data"], extends=Extends(service_name="frontend"), ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/111000.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", depends_on=["backend"], volumes=["db-data"], links=["db:database"], ), Service( name="backend", image="awesome/backend", ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/111001.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], volumes=["db-data"], depends_on=["monitoring"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/111010.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", volumes=["db-data"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/111011.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], volumes=["db-data"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/111100.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", image="awesome/backend", volumes=["db-data"], depends_on=["monitoring"], ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/111101.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", image="awesome/backend", networks=["back-tier", "admin"], volumes=["db-data"], depends_on=["monitoring"], ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/111110.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", ), Service( name="monitoring", image="awesome/monitoring", ), Service( name="backend", volumes=["db-data"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ( "tests/in/111111.yaml", Compose( [ Service( name="frontend", image="awesome/webapp", networks=["front-tier", "back-tier"], ), Service( name="monitoring", image="awesome/monitoring", networks=["admin"], ), Service( name="backend", networks=["back-tier", "admin"], volumes=["db-data"], depends_on=["monitoring"], extends=Extends(service_name="frontend"), ports=["8000:5010"], links=["db:database"], ), Service( name="db", image="postgres", ), ] ), ), ], ) def test_parse_file(test_input: str, expected: Compose) -> None: parser = Parser() actual = parser.parse(test_input) assert len(actual.services) == len(expected.services) for actual_service, expected_service in zip(actual.services, expected.services): assert actual_service.name == expected_service.name assert actual_service.image == expected_service.image assert actual_service.ports == expected_service.ports assert actual_service.networks == expected_service.networks assert actual_service.volumes == expected_service.volumes assert actual_service.depends_on == expected_service.depends_on assert actual_service.links == expected_service.links assert actual_service.extends == expected_service.extends