createDbiDummy(); $dbiDummy->addSelectDb('test_db'); $dbiDummy->addResult('ALTER TABLE `test_table` ADD UNIQUE(`test_field`);', true); $dbi = $this->createDatabaseInterface($dbiDummy); DatabaseInterface::$instance = $dbi; $request = $this->createStub(ServerRequest::class); $request->method('getParsedBodyParam')->willReturnMap([['selected_fld', [], ['test_field']]]); $controllerStub = $this->createMock(StructureController::class); $controllerStub->expects($this->once())->method('__invoke')->with($request); $indexes = new Indexes(DatabaseInterface::getInstance()); $controller = new UniqueController(new ResponseRenderer(), new Template(), $controllerStub, $indexes); $controller($request); $this->assertEquals(Message::success(), $GLOBALS['message']); /** @psalm-suppress TypeDoesNotContainType */ $this->assertSame('ALTER TABLE `test_table` ADD UNIQUE(`test_field`);', $GLOBALS['sql_query']); $dbiDummy->assertAllSelectsConsumed(); $dbiDummy->assertAllQueriesConsumed(); } public function testAddUniqueKeyToMultipleFields(): void { Current::$database = 'test_db'; Current::$table = 'test_table'; $GLOBALS['message'] = null; $GLOBALS['sql_query'] = null; $dbiDummy = $this->createDbiDummy(); $dbiDummy->addSelectDb('test_db'); $dbiDummy->addResult('ALTER TABLE `test_table` ADD UNIQUE(`test_field1`, `test_field2`);', true); $dbi = $this->createDatabaseInterface($dbiDummy); DatabaseInterface::$instance = $dbi; $request = $this->createStub(ServerRequest::class); $request->method('getParsedBodyParam')->willReturnMap([['selected_fld', [], ['test_field1', 'test_field2']]]); $controllerStub = $this->createMock(StructureController::class); $controllerStub->expects($this->once())->method('__invoke')->with($request); $indexes = new Indexes(DatabaseInterface::getInstance()); $controller = new UniqueController(new ResponseRenderer(), new Template(), $controllerStub, $indexes); $controller($request); $this->assertEquals(Message::success(), $GLOBALS['message']); /** @psalm-suppress TypeDoesNotContainType */ $this->assertSame('ALTER TABLE `test_table` ADD UNIQUE(`test_field1`, `test_field2`);', $GLOBALS['sql_query']); $dbiDummy->assertAllSelectsConsumed(); $dbiDummy->assertAllQueriesConsumed(); } public function testNoColumnsSelected(): void { Current::$database = 'test_db'; Current::$table = 'test_table'; $GLOBALS['message'] = null; $GLOBALS['sql_query'] = null; $dbi = $this->createDatabaseInterface(); DatabaseInterface::$instance = $dbi; $request = $this->createStub(ServerRequest::class); $request->method('getParsedBodyParam')->willReturnMap([['selected_fld', [], null]]); $controllerStub = $this->createMock(StructureController::class); $controllerStub->expects($this->never())->method('__invoke'); $response = new ResponseRenderer(); $indexes = new Indexes(DatabaseInterface::getInstance()); $controller = new UniqueController($response, new Template(), $controllerStub, $indexes); $controller($request); $this->assertFalse($response->hasSuccessState()); $this->assertSame(['message' => 'No column selected.'], $response->getJSONResult()); /** @psalm-suppress RedundantCondition */ $this->assertNull($GLOBALS['message']); /** @psalm-suppress RedundantCondition */ $this->assertNull($GLOBALS['sql_query']); } public function testAddUniqueKeyWithError(): void { Current::$database = 'test_db'; Current::$table = 'test_table'; $GLOBALS['message'] = null; $GLOBALS['sql_query'] = null; $dbiDummy = $this->createDbiDummy(); $dbiDummy->addSelectDb('test_db'); $dbiDummy->addResult('ALTER TABLE `test_table` ADD UNIQUE(`test_field`);', false); $dbiDummy->addErrorCode('#1062 - Duplicate entry '2' for key 'test_field''); $dbi = $this->createDatabaseInterface($dbiDummy); DatabaseInterface::$instance = $dbi; $request = $this->createStub(ServerRequest::class); $request->method('getParsedBodyParam')->willReturnMap([['selected_fld', [], ['test_field']]]); $controllerStub = $this->createMock(StructureController::class); $controllerStub->expects($this->once())->method('__invoke')->with($request); $indexes = new Indexes(DatabaseInterface::getInstance()); $controller = new UniqueController(new ResponseRenderer(), new Template(), $controllerStub, $indexes); $controller($request); $this->assertEquals( Message::error('#1062 - Duplicate entry '2' for key 'test_field''), $GLOBALS['message'], ); /** @psalm-suppress TypeDoesNotContainType */ $this->assertSame('ALTER TABLE `test_table` ADD UNIQUE(`test_field`);', $GLOBALS['sql_query']); $dbiDummy->assertAllSelectsConsumed(); $dbiDummy->assertAllQueriesConsumed(); $dbiDummy->assertAllErrorCodesConsumed(); } }