Compare commits

...

2 commits

Author SHA1 Message Date
kwlo
10b53c3772 Wrapping text in json object with 'data' as key
Some checks failed
tests / ci (push) Has been cancelled
2025-11-04 09:08:25 +01:00
kwlo
52dfe92054 Allow plain text response for plugin data polling 2025-11-04 09:08:25 +01:00
2 changed files with 31 additions and 3 deletions

View file

@ -235,9 +235,15 @@ class Plugin extends Model
}
}
// Default to JSON parsing
try {
return $httpResponse->json() ?? [];
// Attempt to parse it into JSON
$json = $httpResponse->json();
if($json !== null) {
return $json;
}
// Response doesn't seem to be JSON, wrap the response body text as a JSON object
return ['data' => $httpResponse->body()];
} catch (Exception $e) {
Log::warning('Failed to parse JSON response: '.$e->getMessage());

View file

@ -72,7 +72,7 @@ test('plugin parses XML responses and wraps under rss key', function (): void {
expect($plugin->data_payload['rss']['channel']['item'])->toHaveCount(2);
});
test('plugin handles non-XML content-type as JSON', function (): void {
test('plugin parses JSON-parsable response body as JSON', function (): void {
$jsonContent = '{"title": "Test Data", "items": [1, 2, 3]}';
Http::fake([
@ -95,6 +95,28 @@ test('plugin handles non-XML content-type as JSON', function (): void {
]);
});
test('plugin wraps plain text response body as JSON', function (): void {
$jsonContent = 'Lorem ipsum dolor sit amet';
Http::fake([
'example.com/data' => Http::response($jsonContent, 200, ['Content-Type' => 'text/plain']),
]);
$plugin = Plugin::factory()->create([
'data_strategy' => 'polling',
'polling_url' => 'https://example.com/data',
'polling_verb' => 'get',
]);
$plugin->updateDataPayload();
$plugin->refresh();
expect($plugin->data_payload)->toBe([
'data' => 'Lorem ipsum dolor sit amet',
]);
});
test('plugin handles invalid XML gracefully', function (): void {
$invalidXml = '<root><item>unclosed tag';