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