Skip to content

Commit dc58c46

Browse files
committed
Add mock for testing
1 parent b543883 commit dc58c46

3 files changed

Lines changed: 53 additions & 14 deletions

File tree

src/Message/OpcodeRegistry.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
class OpcodeRegistry
2020
{
2121
/** @var array<int<1, 15>, class-string> $map */
22-
private array $map = [
22+
protected array $map = [
2323
1 => Text::class,
2424
2 => Binary::class,
2525
8 => Close::class,
@@ -65,7 +65,15 @@ public function createMessage(int $opcode): Message
6565
$opcode
6666
));
6767
}
68-
return new $classname();
68+
$class = new $classname();
69+
if (!$class instanceof Message) {
70+
throw new BadOpcodeException(sprintf(
71+
'Implementation class %s must extend %s',
72+
$class::class,
73+
Message::class,
74+
));
75+
}
76+
return $class;
6977
}
7078

7179
/**

tests/mock/MockOpcodeRegistry.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
/**
4+
* Copyright (C) 2014-2026 Textalk and contributors.
5+
* This file is part of Websocket PHP and is free software under the ISC License.
6+
*/
7+
8+
namespace WebSocket\Test;
9+
10+
use WebSocket\Message\OpcodeRegistry;
11+
12+
/**
13+
* This class adds invalid opcode/class mappings for testing
14+
*/
15+
class MockOpcodeRegistry extends OpcodeRegistry
16+
{
17+
public function mockBind(int $opcode, string $classname): void
18+
{
19+
// @phpstan-ignore assign.propertyType
20+
$this->map[$opcode] = $classname;
21+
}
22+
}

tests/suites/message/OpcodeRegistryTest.php

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,9 @@
1010
namespace WebSocket\Test\Message;
1111

1212
use DomainException;
13-
use InvalidArgumentException;
1413
use PHPUnit\Framework\TestCase;
15-
use Phrity\Net\Mock\SocketStream;
16-
use Phrity\Net\Mock\Stack\{
17-
ExpectContextTrait,
18-
ExpectSocketStreamTrait,
19-
};
2014
use RangeException;
21-
use Stringable;
2215
use WebSocket\Exception\BadOpcodeException;
23-
use WebSocket\Frame\{
24-
Frame,
25-
FrameHandler
26-
};
2716
use WebSocket\Message\{
2817
Message,
2918
Binary,
@@ -32,8 +21,8 @@
3221
Ping,
3322
Pong,
3423
Text,
35-
MessageHandler
3624
};
25+
use WebSocket\Test\MockOpcodeRegistry;
3726

3827
/**
3928
* Test case for WebSocket\Message\OpcodeRegistry.
@@ -105,4 +94,24 @@ public function testCreateMessageInvalidOpcode(): void
10594
// @phpstan-ignore argument.type
10695
$opcodeRegistry->createMessage(16);
10796
}
97+
98+
public function testCreateMessageUnexistingClass(): void
99+
{
100+
$opcodeRegistry = new MockOpcodeRegistry();
101+
$opcodeRegistry->mockBind(1, 'UnexistingClass');
102+
$this->expectException(BadOpcodeException::class);
103+
$this->expectExceptionMessage('Implementation class "UnexistingClass" for opcode 1 not found');
104+
$opcodeRegistry->createMessage(1);
105+
}
106+
107+
public function testCreateMessageInvalidClass(): void
108+
{
109+
$opcodeRegistry = new MockOpcodeRegistry();
110+
$opcodeRegistry->mockBind(2, $opcodeRegistry::class);
111+
$this->expectException(BadOpcodeException::class);
112+
$this->expectExceptionMessage(
113+
'Implementation class WebSocket\Test\MockOpcodeRegistry must extend WebSocket\Message\Message'
114+
);
115+
$opcodeRegistry->createMessage(2);
116+
}
108117
}

0 commit comments

Comments
 (0)