65 lines
2.3 KiB
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";
|