mirror of
https://github.com/Red5d/docker-autocompose
synced 2026-07-02 23:58:25 +00:00
164 lines
4.7 KiB
Python
164 lines
4.7 KiB
Python
import unittest
|
|
from unittest.mock import patch
|
|
|
|
from src import autocompose
|
|
|
|
|
|
class FakeContainerSummary:
|
|
name = "svc"
|
|
short_id = "abc123"
|
|
|
|
|
|
class FakeContainerWithAttrs:
|
|
def __init__(self, attrs):
|
|
self.attrs = attrs
|
|
|
|
|
|
class FakeContainers:
|
|
def __init__(self, attrs):
|
|
self._attrs = attrs
|
|
self._summary = FakeContainerSummary()
|
|
|
|
def list(self, **_kwargs):
|
|
return [self._summary]
|
|
|
|
def get(self, _cid):
|
|
return FakeContainerWithAttrs(self._attrs)
|
|
|
|
|
|
class FakeNetwork:
|
|
def __init__(self, name, internal=False):
|
|
self.attrs = {"Name": name, "Internal": internal}
|
|
|
|
|
|
class FakeNetworks:
|
|
def __init__(self, networks):
|
|
self._networks = [FakeNetwork(name, internal) for name, internal in networks]
|
|
|
|
def list(self):
|
|
return self._networks
|
|
|
|
|
|
class FakeDockerClient:
|
|
def __init__(self, attrs, networks):
|
|
self.containers = FakeContainers(attrs)
|
|
self.networks = FakeNetworks(networks)
|
|
|
|
|
|
def make_attrs(networks, healthcheck=None):
|
|
return {
|
|
"Name": "/svc",
|
|
"HostConfig": {
|
|
"CapDrop": None,
|
|
"CgroupParent": None,
|
|
"Dns": None,
|
|
"DnsSearch": None,
|
|
"ExtraHosts": None,
|
|
"Links": None,
|
|
"LogConfig": {"Type": None, "Config": None},
|
|
"SecurityOpt": None,
|
|
"Ulimits": None,
|
|
"VolumeDriver": None,
|
|
"VolumesFrom": None,
|
|
"IpcMode": None,
|
|
"Privileged": None,
|
|
"RestartPolicy": {"Name": None},
|
|
"ReadonlyRootfs": None,
|
|
"Devices": None,
|
|
"PortBindings": {},
|
|
},
|
|
"Config": {
|
|
"Env": None,
|
|
"Image": "test:latest",
|
|
"Labels": {},
|
|
"Entrypoint": None,
|
|
"User": None,
|
|
"WorkingDir": None,
|
|
"Domainname": None,
|
|
"Hostname": None,
|
|
"OpenStdin": None,
|
|
"Tty": None,
|
|
"Cmd": None,
|
|
"ExposedPorts": {},
|
|
"Healthcheck": healthcheck,
|
|
},
|
|
"NetworkSettings": {"Networks": networks, "MacAddress": None},
|
|
"Mounts": [],
|
|
}
|
|
|
|
|
|
class GenerateTests(unittest.TestCase):
|
|
def test_preserves_network_aliases(self):
|
|
attrs = make_attrs(
|
|
{
|
|
"custom_net": {
|
|
"Aliases": ["svc", "db"],
|
|
}
|
|
}
|
|
)
|
|
fake_client = FakeDockerClient(attrs, networks=[("custom_net", False)])
|
|
|
|
with patch("src.autocompose.docker.from_env", return_value=fake_client):
|
|
cfile, c_networks, _ = autocompose.generate("svc")
|
|
|
|
self.assertEqual(cfile["svc"]["networks"], {"custom_net": {"aliases": ["svc", "db"]}})
|
|
self.assertEqual(
|
|
c_networks,
|
|
{"custom_net": {"external": True, "name": "custom_net"}},
|
|
)
|
|
|
|
def test_serializes_healthcheck_config(self):
|
|
attrs = make_attrs(
|
|
{"custom_net": {}},
|
|
healthcheck={
|
|
"Test": ["CMD-SHELL", "echo ok"],
|
|
"Interval": 1000000000,
|
|
"Timeout": 2000000000,
|
|
"Retries": 3,
|
|
"StartPeriod": 3000000000,
|
|
},
|
|
)
|
|
fake_client = FakeDockerClient(attrs, networks=[("custom_net", False)])
|
|
|
|
with patch("src.autocompose.docker.from_env", return_value=fake_client):
|
|
cfile, _, _ = autocompose.generate("svc")
|
|
|
|
self.assertEqual(
|
|
cfile["svc"]["healthcheck"],
|
|
{
|
|
"test": ["CMD-SHELL", "echo ok"],
|
|
"interval": "1000000000ns",
|
|
"timeout": "2000000000ns",
|
|
"retries": 3,
|
|
"start_period": "3000000000ns",
|
|
},
|
|
)
|
|
|
|
def test_simple_custom_network_uses_list_form(self):
|
|
attrs = make_attrs({"custom_net": {}})
|
|
fake_client = FakeDockerClient(attrs, networks=[("custom_net", True)])
|
|
|
|
with patch("src.autocompose.docker.from_env", return_value=fake_client):
|
|
cfile, c_networks, _ = autocompose.generate("svc")
|
|
|
|
self.assertEqual(cfile["svc"]["networks"], ["custom_net"])
|
|
self.assertEqual(
|
|
c_networks,
|
|
{"custom_net": {"external": False, "name": "custom_net"}},
|
|
)
|
|
|
|
def test_default_network_still_uses_network_mode(self):
|
|
attrs = make_attrs({"bridge": {}})
|
|
fake_client = FakeDockerClient(attrs, networks=[("bridge", False)])
|
|
|
|
with patch("src.autocompose.docker.from_env", return_value=fake_client):
|
|
cfile, c_networks, _ = autocompose.generate("svc")
|
|
|
|
self.assertEqual(cfile["svc"]["network_mode"], "bridge")
|
|
self.assertNotIn("networks", cfile["svc"])
|
|
self.assertIsNone(c_networks)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|