parse($content); self::assertCount(1, $result['blocks']); $b = $result['blocks'][0]; self::assertSame('http_host', $b['source']); self::assertSame('MAGE_RUN_CODE', $b['target']); self::assertSame(1, $b['startLine']); self::assertSame(5, $b['endLine']); self::assertCount(2, $b['entries']); self::assertSame('dev.example.com', $b['entries'][0]['hostname']); self::assertSame('mgtun_abc123', $b['entries'][0]['value']); self::assertSame('other.host', $b['entries'][1]['hostname']); self::assertSame('mgtun_xyz', $b['entries'][1]['value']); } public function testParseEmptyContent(): void { $parser = new NginxMapParser(); self::assertSame([], $parser->parse('')['blocks']); } public function testRebuildRoundTripPreservesNonMapLines(): void { $original = <<<'NGINX' before map $http_host $MAGE_RUN_CODE { default ''; host1 code1; } after NGINX; $parser = new NginxMapParser(); $parsed = $parser->parse($original); $rebuilt = $parser->rebuild($original, $parsed); self::assertStringContainsString('before', $rebuilt); self::assertStringContainsString('after', $rebuilt); self::assertStringContainsString('map $http_host $MAGE_RUN_CODE {', $rebuilt); self::assertStringContainsString('host1 code1;', $rebuilt); } public function testRebuildThrowsWhenBlockMissingLineMetadata(): void { $parser = new NginxMapParser(); $this->expectException(\InvalidArgumentException::class); $parser->rebuild("map \$h \$t {\n}\n", [ 'blocks' => [ [ 'source' => 'h', 'target' => 't', 'entries' => [], ], ], ]); } }