Skip to content

Commit 163c855

Browse files
CopilotiBotPeaches
andauthored
test: cover actions fallback and missing action validation
Agent-Logs-Url: https://github.com/openai-php/client/sessions/18ddc838-e520-4048-879d-4a1218823f7a Co-authored-by: iBotPeaches <611784+iBotPeaches@users.noreply.github.com>
1 parent de2a822 commit 163c855

2 files changed

Lines changed: 52 additions & 1 deletion

File tree

src/Responses/Responses/Output/OutputComputerToolCall.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,16 @@ private function __construct(
6363
*/
6464
public static function from(array $attributes): self
6565
{
66-
$actionAttributes = $attributes['action'] ?? ($attributes['actions'][0] ?? []);
66+
$actionAttributes = [];
67+
if (isset($attributes['action'])) {
68+
$actionAttributes = $attributes['action'];
69+
} elseif (isset($attributes['actions']) && isset($attributes['actions'][0])) {
70+
$actionAttributes = $attributes['actions'][0];
71+
}
72+
73+
if (! isset($actionAttributes['type'])) {
74+
throw new \InvalidArgumentException('Missing required computer action payload.');
75+
}
6776

6877
$action = match ($actionAttributes['type']) {
6978
'click' => Click::from($actionAttributes),

tests/Responses/Responses/Output/OutputComputerToolCall.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,45 @@
5454
])
5555
->not->toHaveKey('actions');
5656
});
57+
58+
test('from with multiple actions uses the first action', function () {
59+
$payload = outputComputerToolCall();
60+
unset($payload['action']);
61+
$payload['actions'] = [
62+
['type' => 'screenshot'],
63+
['type' => 'wait'],
64+
];
65+
66+
$response = OutputComputerToolCall::from($payload);
67+
68+
expect($response->action)
69+
->toBeInstanceOf(OutputComputerActionScreenshot::class);
70+
});
71+
72+
test('from without action payload throws exception', function () {
73+
$payload = outputComputerToolCall();
74+
unset($payload['action']);
75+
$payload['actions'] = [];
76+
77+
expect(fn (): OutputComputerToolCall => OutputComputerToolCall::from($payload))
78+
->toThrow(InvalidArgumentException::class, 'Missing required computer action payload.');
79+
});
80+
81+
test('from without action and actions keys throws exception', function () {
82+
$payload = outputComputerToolCall();
83+
unset($payload['action'], $payload['actions']);
84+
85+
expect(fn (): OutputComputerToolCall => OutputComputerToolCall::from($payload))
86+
->toThrow(InvalidArgumentException::class, 'Missing required computer action payload.');
87+
});
88+
89+
test('from with malformed actions payload throws exception', function () {
90+
$payload = outputComputerToolCall();
91+
unset($payload['action']);
92+
$payload['actions'] = [
93+
['x' => 1],
94+
];
95+
96+
expect(fn (): OutputComputerToolCall => OutputComputerToolCall::from($payload))
97+
->toThrow(InvalidArgumentException::class, 'Missing required computer action payload.');
98+
});

0 commit comments

Comments
 (0)