aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib/DB/QueryBuilder/Partitioned/JoinConditionTest.php
blob: a8ebf11c2c2f43d2d2fdf75db3f634dfec4bdfd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php

declare(strict_types=1);
/**
 * SPDX-FileCopyrightText: 2024 Robin Appelman <robin@icewind.nl>
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */

namespace lib\DB\QueryBuilder\Partitioned;

use OC\DB\ConnectionAdapter;
use OC\DB\QueryBuilder\Partitioned\JoinCondition;
use OC\DB\QueryBuilder\QueryBuilder;
use OC\SystemConfig;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use Psr\Log\LoggerInterface;
use Test\TestCase;

class JoinConditionTest extends TestCase {
	protected function setUp(): void {
		parent::setUp();
	}

	public function platformProvider(): array {
		return [
			[IDBConnection::PLATFORM_SQLITE],
			[IDBConnection::PLATFORM_POSTGRES],
			[IDBConnection::PLATFORM_MYSQL],
			[IDBConnection::PLATFORM_ORACLE],
		];
	}

	private function getBuilder(string $platform): IQueryBuilder {
		$connection = $this->createMock(ConnectionAdapter::class);
		$connection->method('getDatabaseProvider')->willReturn($platform);
		return new QueryBuilder(
			$connection,
			$this->createMock(SystemConfig::class),
			$this->createMock(LoggerInterface::class)
		);
	}

	/**
	 * @dataProvider platformProvider
	 */
	public function testParseCondition(string $platform): void {
		$query = $this->getBuilder($platform);
		$param1 = $query->createNamedParameter('files');
		$param2 = $query->createNamedParameter('test');
		$condition = $query->expr()->andX(
			$query->expr()->eq('tagmap.categoryid', 'tag.id'),
			$query->expr()->eq('tag.type', $param1),
			$query->expr()->eq('tag.uid', $param2)
		);
		$parsed = JoinCondition::parse($condition, 'vcategory', 'tag', 'tagmap');
		$this->assertEquals('tagmap.categoryid', $parsed->fromColumn);
		$this->assertEquals('tag.id', $parsed->toColumn);
		$this->assertEquals([], $parsed->fromConditions);
		$this->assertEquals([
			$query->expr()->eq('tag.type', $param1),
			$query->expr()->eq('tag.uid', $param2),
		], $parsed->toConditions);
	}

	/**
	 * @dataProvider platformProvider
	 */
	public function testParseCastCondition(string $platform): void {
		$query = $this->getBuilder($platform);

		$condition = $query->expr()->eq($query->expr()->castColumn('m.objectid', IQueryBuilder::PARAM_INT), 'f.fileid');
		$parsed = JoinCondition::parse($condition, 'filecache', 'f', 'm');
		$this->assertEquals('m.objectid', $parsed->fromColumn);
		$this->assertEquals('f.fileid', $parsed->toColumn);
		$this->assertEquals([], $parsed->fromConditions);
	}
}