Skip to content

Commit ca38a34

Browse files
committed
fix(api-client): fix handling of exposed ports without host bindings
1 parent 17cf200 commit ca38a34

2 files changed

Lines changed: 39 additions & 2 deletions

File tree

src/Util/ContainerResponseToContainerDtoUtil.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public function __invoke(
4242
$ports = [];
4343
foreach ($networkSettings->getPorts() ?? [] as $portKey => $portBindings) {
4444
if (empty($portBindings)) {
45+
// PortBindung without host binding
46+
$ports[$portKey] = new \WebProject\DockerApi\Library\Generated\Model\PortBinding();
4547
continue;
4648
}
4749
// PortBinding is expected by DTO for each string key

tests/Unit/Util/ContainerResponseToContainerDtoUtilTest.php

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
use PHPUnit\Framework\Attributes\CoversClass;
88
use WebProject\DockerApi\Library\Generated\Model\EndpointSettings;
9+
use WebProject\DockerApi\Library\Generated\Model\PortBinding;
910
use WebProject\DockerApiClient\Util\ContainerResponseToContainerDtoUtil;
1011

1112
#[CoversClass(ContainerResponseToContainerDtoUtil::class)]
@@ -59,9 +60,10 @@ public function testInvokeMaxValues(): void
5960

6061
$networkSettings = new \WebProject\DockerApi\Library\Generated\Model\NetworkSettings();
6162
$networkSettings->setNetworks(networks: ['ca7d9ec2cf61951cf24ed7c91006927fa1259aabaf07e334f5e0b0fe36ce5794' => $endpoint, '4a7d9ec2cf61951cf24ed7c91006927fa1259aabaf07e334f5e0b0fe36ce5794' => $endpoint2]);
62-
$networkSettings->setPorts([]);
63+
$networkSettings->setPorts(['5006/tcp' => []]);
6364

6465
$containerInspectResponse->setNetworkSettings(networkSettings: $networkSettings);
66+
$containerInspectResponse->setState(state: (new \WebProject\DockerApi\Library\Generated\Model\ContainerState())->setRunning(running: true));
6567

6668
$containerConfig = new \WebProject\DockerApi\Library\Generated\Model\ContainerConfig();
6769
$containerConfig->setEnv(
@@ -104,12 +106,45 @@ public function testInvokeMaxValues(): void
104106
],
105107
];
106108
$this->assertSame($expectedNetworks, $containerDto->networks);
107-
$this->assertFalse($containerDto->running);
109+
$this->assertTrue($containerDto->running);
108110
$this->assertSame('container-name', $containerDto->getName());
109111
$this->assertSame(['container-name'], $containerDto->getHostnames(tld: ''));
110112
$this->assertSame(
111113
['actual.reverse-proxy-subdomain.xyz', 'domain-name.reverse-proxy-subdomain.xyz'],
112114
$containerDto->extractUrlsFromEnvVars(extractFromEnvVars: ['DOMAIN_NAME', 'VIRTUAL_HOST'])
113115
);
116+
$this->assertTrue($containerDto->isExposed());
117+
}
118+
119+
public function testExposedPortsWithoutHostBindingAreValid(): void
120+
{
121+
// Arrange
122+
$containerInspectResponse = new \WebProject\DockerApi\Library\Generated\Model\ContainerInspectResponse();
123+
$containerInspectResponse->setId(id: 'container-idValue');
124+
$containerInspectResponse->setImage(image: 'container-imageValue');
125+
$containerInspectResponse->setName(name: '/container-name');
126+
127+
$networkSettings = new \WebProject\DockerApi\Library\Generated\Model\NetworkSettings();
128+
$networkSettings->setNetworks(networks: []);
129+
$networkSettings->setPorts(ports: ['80/tcp' => [], '8080/tcp' => [new PortBinding()]]);
130+
$containerInspectResponse->setNetworkSettings(networkSettings: $networkSettings);
131+
132+
$containerConfig = new \WebProject\DockerApi\Library\Generated\Model\ContainerConfig();
133+
$containerConfig->setEnv(env: []);
134+
$containerInspectResponse->setConfig(config: $containerConfig);
135+
$containerInspectResponse->setState(state: (new \WebProject\DockerApi\Library\Generated\Model\ContainerState())->setRunning(running: true));
136+
137+
// Act
138+
$containerDto = (new ContainerResponseToContainerDtoUtil())(containerInspect: $containerInspectResponse);
139+
140+
// Assert
141+
$this->assertSame('container-idValue', $containerDto->id);
142+
$this->assertSame('container-imageValue', $containerDto->image);
143+
$this->assertSame([], $containerDto->ipAddresses);
144+
$this->assertSame([], $containerDto->networks);
145+
$this->assertTrue($containerDto->running);
146+
$this->assertSame('container-name', $containerDto->getName());
147+
$this->assertSame(['container-name'], $containerDto->getHostnames(tld: ''));
148+
$this->assertTrue($containerDto->isExposed());
114149
}
115150
}

0 commit comments

Comments
 (0)