feca-mailshots-plugin/tests/unit/test_dsl_fen_builtins.php

65 lines
2.3 KiB
PHP

<?php
declare(strict_types=1);
require_once dirname(__DIR__, 2) . '/feca_mailshots_plugin/src/autoload.php';
require_once __DIR__ . '/FakeMetadataProvider.php';
use FecaMailshots\Application\DslCompiler;
use FecaMailshots\Application\DslValidator;
use FecaMailshots\Domain\DslParser;
use FecaMailshots\Tests\Unit\FakeMetadataProvider;
$metadata = new FakeMetadataProvider([
'advertisers' => ['name', 'advertisername'],
'ads' => ['id', 'advertiser', 'adsize', 'size', 'price', 'issue', 'pageid', 'state', 'notes'],
'pages' => ['id', 'issue', 'page'],
'articles' => ['id', 'pageid', 'articlenumber', 'article', 'content', 'membername', 'author', 'dcn', 'articlewords', 'otherwords', 'othercontent', 'other'],
'issues' => ['id', 'issue', 'issuemonths', 'description'],
'invoices' => ['id', 'issue', 'issue_id', 'ad_id', 'invoice_number', 'status'],
]);
$parser = new DslParser();
$validator = new DslValidator($metadata);
$compiler = new DslCompiler($metadata);
$cases = [
'ads and pages where ad-in-issue(202605)' => [
'needle' => 'p_ad_issue.`Issue` = ?',
'params' => [202605],
],
'articles and pages where page-in-issue(202605)' => [
'needle' => 's_pages.`Issue` = ?',
'params' => [202605],
],
'advertisers and ads where selected' => [
'needle' => 'COALESCE(s_advertisers.`Selected`, 0) <> 0',
'params' => [],
],
'invoices and ads where invoice-ids(10, 11)' => [
'needle' => 's_invoices.`id` IN (?,?)',
'params' => [10, 11],
],
];
foreach ($cases as $dsl => $expect) {
$ast = $parser->parse($dsl);
$validation = $validator->validate($ast);
if (($validation['errors'] ?? []) !== []) {
fwrite(STDERR, "Expected valid DSL {$dsl}: " . json_encode($validation['errors']) . "\n");
exit(1);
}
$compiled = $compiler->compile($ast);
$sql = (string) ($compiled['sql'] ?? '');
if (strpos($sql, $expect['needle']) === false) {
fwrite(STDERR, "Expected SQL for {$dsl} to contain {$expect['needle']}\n{$sql}\n");
exit(1);
}
if (($compiled['params'] ?? []) !== $expect['params']) {
fwrite(STDERR, "Unexpected params for {$dsl}: " . json_encode($compiled['params'] ?? []) . "\n");
exit(1);
}
}
echo "DSL FEN built-in tests passed\n";