Skip to content

Commit 74800cb

Browse files
committed
test: add comprehensive test coverage for multiple classes
- Add tests for Terminal class (13 tests) - Add tests for InputHandler class (2 tests) - Add tests for MonitorManager class (7 tests) - Add tests for TestGenerator class (5 tests) - Add tests for ExternalReferenceProcessingTrait (4 tests) - Add tests for SeedDataGenerator class (13 tests) - Add tests for OracleDdlQueryBuilder class (17 tests) - Add tests for OracleSqlFormatter class (14 tests) Total: 76 new tests with 167 assertions. Code coverage increased from 65.24% to 65.40% (Lines: 18048/27596). All tests pass successfully.
1 parent 5bfc88c commit 74800cb

8 files changed

+889
-2611
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace tommyknocker\pdodb\tests\oracle;
6+
7+
use tommyknocker\pdodb\dialects\oracle\OracleDdlQueryBuilder;
8+
use tommyknocker\pdodb\query\schema\ColumnSchema;
9+
10+
/**
11+
* Tests for OracleDdlQueryBuilder class.
12+
*/
13+
final class OracleDdlQueryBuilderTests extends BaseOracleTestCase
14+
{
15+
protected function createBuilder(): OracleDdlQueryBuilder
16+
{
17+
return new OracleDdlQueryBuilder(
18+
self::$db->connection,
19+
''
20+
);
21+
}
22+
23+
public function testNumberWithoutPrecision(): void
24+
{
25+
$builder = $this->createBuilder();
26+
$column = $builder->number();
27+
$this->assertInstanceOf(ColumnSchema::class, $column);
28+
$this->assertEquals('NUMBER', $column->getType());
29+
}
30+
31+
public function testNumberWithPrecision(): void
32+
{
33+
$builder = $this->createBuilder();
34+
$column = $builder->number(10);
35+
$this->assertInstanceOf(ColumnSchema::class, $column);
36+
$this->assertEquals('NUMBER(10)', $column->getType());
37+
}
38+
39+
public function testNumberWithPrecisionAndScale(): void
40+
{
41+
$builder = $this->createBuilder();
42+
$column = $builder->number(10, 2);
43+
$this->assertInstanceOf(ColumnSchema::class, $column);
44+
$this->assertEquals('NUMBER(10,2)', $column->getType());
45+
}
46+
47+
public function testVarchar2(): void
48+
{
49+
$builder = $this->createBuilder();
50+
$column = $builder->varchar2(255);
51+
$this->assertInstanceOf(ColumnSchema::class, $column);
52+
$this->assertEquals('VARCHAR2(255)', $column->getType());
53+
}
54+
55+
public function testNvarchar2(): void
56+
{
57+
$builder = $this->createBuilder();
58+
$column = $builder->nvarchar2(255);
59+
$this->assertInstanceOf(ColumnSchema::class, $column);
60+
$this->assertEquals('NVARCHAR2(255)', $column->getType());
61+
}
62+
63+
public function testClob(): void
64+
{
65+
$builder = $this->createBuilder();
66+
$column = $builder->clob();
67+
$this->assertInstanceOf(ColumnSchema::class, $column);
68+
$this->assertEquals('CLOB', $column->getType());
69+
}
70+
71+
public function testBlob(): void
72+
{
73+
$builder = $this->createBuilder();
74+
$column = $builder->blob();
75+
$this->assertInstanceOf(ColumnSchema::class, $column);
76+
$this->assertEquals('BLOB', $column->getType());
77+
}
78+
79+
public function testTimestampWithoutPrecision(): void
80+
{
81+
$builder = $this->createBuilder();
82+
$column = $builder->timestamp();
83+
$this->assertInstanceOf(ColumnSchema::class, $column);
84+
$this->assertEquals('TIMESTAMP', $column->getType());
85+
}
86+
87+
public function testTimestampWithPrecision(): void
88+
{
89+
$builder = $this->createBuilder();
90+
$column = $builder->timestamp(6);
91+
$this->assertInstanceOf(ColumnSchema::class, $column);
92+
$this->assertEquals('TIMESTAMP(6)', $column->getType());
93+
}
94+
95+
public function testTimestampTzWithoutPrecision(): void
96+
{
97+
$builder = $this->createBuilder();
98+
$column = $builder->timestampTz();
99+
$this->assertInstanceOf(ColumnSchema::class, $column);
100+
$this->assertEquals('TIMESTAMP WITH TIME ZONE', $column->getType());
101+
}
102+
103+
public function testTimestampTzWithPrecision(): void
104+
{
105+
$builder = $this->createBuilder();
106+
$column = $builder->timestampTz(6);
107+
$this->assertInstanceOf(ColumnSchema::class, $column);
108+
$this->assertEquals('TIMESTAMP(6) WITH TIME ZONE', $column->getType());
109+
}
110+
111+
public function testDate(): void
112+
{
113+
$builder = $this->createBuilder();
114+
$column = $builder->date();
115+
$this->assertInstanceOf(ColumnSchema::class, $column);
116+
$this->assertEquals('DATE', $column->getType());
117+
}
118+
119+
public function testTime(): void
120+
{
121+
$builder = $this->createBuilder();
122+
$column = $builder->time();
123+
$this->assertInstanceOf(ColumnSchema::class, $column);
124+
// Oracle doesn't support TIME type, uses TIMESTAMP instead
125+
$this->assertEquals('TIMESTAMP', $column->getType());
126+
}
127+
128+
public function testUuid(): void
129+
{
130+
$builder = $this->createBuilder();
131+
$column = $builder->uuid();
132+
$this->assertInstanceOf(ColumnSchema::class, $column);
133+
$this->assertEquals('RAW', $column->getType());
134+
$this->assertEquals(16, $column->getLength());
135+
}
136+
137+
public function testJson(): void
138+
{
139+
$builder = $this->createBuilder();
140+
$column = $builder->json();
141+
$this->assertInstanceOf(ColumnSchema::class, $column);
142+
$this->assertEquals('VARCHAR2', $column->getType());
143+
$this->assertEquals(4000, $column->getLength());
144+
}
145+
146+
public function testNclob(): void
147+
{
148+
$builder = $this->createBuilder();
149+
$column = $builder->nclob();
150+
$this->assertInstanceOf(ColumnSchema::class, $column);
151+
$this->assertEquals('NCLOB', $column->getType());
152+
}
153+
154+
public function testXmltype(): void
155+
{
156+
$builder = $this->createBuilder();
157+
$column = $builder->xmltype();
158+
$this->assertInstanceOf(ColumnSchema::class, $column);
159+
$this->assertEquals('XMLTYPE', $column->getType());
160+
}
161+
}
Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace tommyknocker\pdodb\tests\oracle;
6+
7+
use tommyknocker\pdodb\dialects\oracle\OracleSqlFormatter;
8+
9+
/**
10+
* Tests for OracleSqlFormatter class.
11+
*/
12+
final class OracleSqlFormatterTests extends BaseOracleTestCase
13+
{
14+
protected function createFormatter(): OracleSqlFormatter
15+
{
16+
return new OracleSqlFormatter(self::$db->connection->getDialect());
17+
}
18+
19+
public function testFormatLimitOffsetWithLimitOnly(): void
20+
{
21+
$formatter = $this->createFormatter();
22+
$sql = 'SELECT * FROM users';
23+
$result = $formatter->formatLimitOffset($sql, 10, null);
24+
$this->assertStringContainsString('FETCH NEXT 10 ROWS ONLY', $result);
25+
}
26+
27+
public function testFormatLimitOffsetWithOffsetOnly(): void
28+
{
29+
$formatter = $this->createFormatter();
30+
$sql = 'SELECT * FROM users';
31+
$result = $formatter->formatLimitOffset($sql, null, 20);
32+
$this->assertStringContainsString('OFFSET 20 ROWS', $result);
33+
}
34+
35+
public function testFormatLimitOffsetWithLimitAndOffset(): void
36+
{
37+
$formatter = $this->createFormatter();
38+
$sql = 'SELECT * FROM users';
39+
$result = $formatter->formatLimitOffset($sql, 10, 20);
40+
$this->assertStringContainsString('OFFSET 20 ROWS', $result);
41+
$this->assertStringContainsString('FETCH NEXT 10 ROWS ONLY', $result);
42+
}
43+
44+
public function testFormatLimitOffsetWithoutLimitAndOffset(): void
45+
{
46+
$formatter = $this->createFormatter();
47+
$sql = 'SELECT * FROM users';
48+
$result = $formatter->formatLimitOffset($sql, null, null);
49+
$this->assertEquals($sql, $result);
50+
}
51+
52+
public function testFormatSelectOptionsWithForUpdate(): void
53+
{
54+
$formatter = $this->createFormatter();
55+
$sql = 'SELECT * FROM users';
56+
$result = $formatter->formatSelectOptions($sql, ['FOR UPDATE']);
57+
$this->assertStringContainsString('FOR UPDATE', $result);
58+
}
59+
60+
public function testFormatSelectOptionsWithForUpdateNowait(): void
61+
{
62+
$formatter = $this->createFormatter();
63+
$sql = 'SELECT * FROM users';
64+
$result = $formatter->formatSelectOptions($sql, ['FOR UPDATE NOWAIT']);
65+
$this->assertStringContainsString('FOR UPDATE NOWAIT', $result);
66+
}
67+
68+
public function testFormatSelectOptionsWithForUpdateWait(): void
69+
{
70+
$formatter = $this->createFormatter();
71+
$sql = 'SELECT * FROM users';
72+
$result = $formatter->formatSelectOptions($sql, ['FOR UPDATE WAIT']);
73+
$this->assertStringContainsString('FOR UPDATE WAIT', $result);
74+
}
75+
76+
public function testFormatSelectOptionsWithInvalidOption(): void
77+
{
78+
$formatter = $this->createFormatter();
79+
$sql = 'SELECT * FROM users';
80+
$result = $formatter->formatSelectOptions($sql, ['INVALID OPTION']);
81+
$this->assertEquals($sql, $result);
82+
}
83+
84+
public function testFormatSelectOptionsWithEmptyOptions(): void
85+
{
86+
$formatter = $this->createFormatter();
87+
$sql = 'SELECT * FROM users';
88+
$result = $formatter->formatSelectOptions($sql, []);
89+
$this->assertEquals($sql, $result);
90+
}
91+
92+
public function testFormatWindowFunctionWithPartitionBy(): void
93+
{
94+
$formatter = $this->createFormatter();
95+
$result = $formatter->formatWindowFunction('ROW_NUMBER', [], ['status'], [], null);
96+
$this->assertStringContainsString('ROW_NUMBER()', $result);
97+
$this->assertStringContainsString('PARTITION BY', $result);
98+
// Oracle converts identifiers to uppercase
99+
$this->assertStringContainsString('STATUS', $result);
100+
}
101+
102+
public function testFormatWindowFunctionWithOrderBy(): void
103+
{
104+
$formatter = $this->createFormatter();
105+
$result = $formatter->formatWindowFunction('ROW_NUMBER', [], [], [['id' => 'ASC']], null);
106+
$this->assertStringContainsString('ROW_NUMBER()', $result);
107+
$this->assertStringContainsString('ORDER BY', $result);
108+
// Oracle converts identifiers to uppercase
109+
$this->assertStringContainsString('ID', $result);
110+
$this->assertStringContainsString('ASC', $result);
111+
}
112+
113+
public function testFormatWindowFunctionWithPartitionByAndOrderBy(): void
114+
{
115+
$formatter = $this->createFormatter();
116+
$result = $formatter->formatWindowFunction('ROW_NUMBER', [], ['status'], [['id' => 'DESC']], null);
117+
$this->assertStringContainsString('PARTITION BY', $result);
118+
$this->assertStringContainsString('ORDER BY', $result);
119+
$this->assertStringContainsString('DESC', $result);
120+
}
121+
122+
public function testFormatWindowFunctionWithArgs(): void
123+
{
124+
$formatter = $this->createFormatter();
125+
$result = $formatter->formatWindowFunction('SUM', ['amount'], [], [], null);
126+
$this->assertStringContainsString('SUM(', $result);
127+
// Oracle converts identifiers to uppercase
128+
$this->assertStringContainsString('AMOUNT', $result);
129+
}
130+
131+
public function testFormatWindowFunctionWithFrameClause(): void
132+
{
133+
$formatter = $this->createFormatter();
134+
$result = $formatter->formatWindowFunction('SUM', ['amount'], [], [], 'ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW');
135+
$this->assertStringContainsString('ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW', $result);
136+
}
137+
}

0 commit comments

Comments
 (0)