diff --git a/tests/unit/lib/Controller/AdminControllerTest.php b/tests/unit/lib/Controller/AdminControllerTest.php index f67b1d1c2..6affbeedb 100644 --- a/tests/unit/lib/Controller/AdminControllerTest.php +++ b/tests/unit/lib/Controller/AdminControllerTest.php @@ -1,7 +1,7 @@ getContainer()->get(IUserManager::class); - /** @var CircleService|MockObject */ - private $circleService; + foreach ([self::TEST_USER_1, self::TEST_USER_2] as $userId) { + $user = $userManager->get($userId); + if ($user === null) { + $userManager->createUser($userId, 'test-pwd'); + self::$usersToCleanup[] = $userId; + } + } + } - /** @var MemberService|MockObject */ - private $memberService; + public function setUp(): void { + parent::setUp(); - /** @var MembershipService|MockObject */ - private $membershipService; + $this->app = new Application(); + $this->container = $this->app->getContainer(); + $this->userManager = $this->container->get(IUserManager::class); - /** @var SearchService|MockObject */ - private $searchService; + $userSession = $this->container->get(IUserSession::class); + $federatedUserService = $this->container->get(FederatedUserService::class); - /** @var ConfigService|MockObject */ - private $configService; + $user1 = $this->userManager->get(self::TEST_USER_1); + $userSession->setUser($user1); + $federatedUserService->setLocalCurrentUser($user1); - /** @var AdminController */ - private $adminController; + $this->adminController = new AdminController( + Application::APP_ID, + $this->container->get(IRequest::class), + $userSession, + $federatedUserService, + $this->container->get(CircleService::class), + $this->container->get(MemberService::class), + $this->container->get(MembershipService::class), + $this->container->get(SearchService::class), + $this->container->get(ConfigService::class), + ); + } - public function setUp(): void { - parent::setUp(); - $this->request = $this->createMock(IRequest::class); - $this->userSession = $this->createMock(IUserSession::class); - $this->federatedUserService = $this->createMock(FederatedUserService::class); - $this->circleService = $this->createMock(CircleService::class); - $this->memberService = $this->createMock(MemberService::class); - $this->membershipService = $this->createMock(MembershipService::class); - $this->searchService = $this->createMock(SearchService::class); - $this->configService = $this->createMock(ConfigService::class); - $this->configService->expects($this->any())->method('getAppValueBool')->with(ConfigService::FRONTEND_ENABLED)->willReturn(true); - $this->adminController = new AdminController(Application::APP_ID, $this->request, $this->userSession, $this->federatedUserService, $this->circleService, $this->memberService, $this->membershipService, $this->searchService, $this->configService); - } - - /** - * @dataProvider dataForCirclesList - * - * @param int $limit - * @param int $offset - * @return void - * @throws OCSException - */ - public function testCirclesList(int $limit, int $offset): void { - $user = $this->createMock(IUser::class); - $user->expects($this->once())->method('getUID')->with()->willReturn('an-user-id'); - $this->userSession->expects($this->any())->method('getUser')->with()->willReturn($user); - - $probe = new CircleProbe(); - $probe->filterHiddenCircles() - ->filterBackendCircles() - ->addDetail(BasicProbe::DETAILS_POPULATION) - ->setItemsOffset($offset) - ->setItemsLimit($limit); - $circle1 = new Circle(); - $circle1->setName('Circle One'); - $circle1->setSingleId('CircleOne'); - $circle2 = new Circle(); - $circle2->setName('Circle Two'); - $circle2->setSingleId('CircleTwo'); - $circle3 = new Circle(); - $circle3->setName('Circle Three'); - $circle3->setSingleId('CircleThree'); - $circles = [$circle1, $circle2, $circle3]; - $selectedCircles = array_slice($circles, $offset, $limit > 0 ? $limit : null); - $this->circleService->expects($this->once())->method('getCircles')->with($probe)->willReturn($selectedCircles); - $response = new DataResponse($this->serializeArray($selectedCircles)); - $this->assertEquals($response, $this->adminController->circles('an-user-id', $limit, $offset)); - } - - public static function dataForCirclesList(): array { - return [ - [-1, 0], - [1, 1] + public static function tearDownAfterClass(): void { + parent::tearDownAfterClass(); + + $app = new Application(); + $userManager = $app->getContainer()->get(IUserManager::class); + + foreach (self::$usersToCleanup as $userId) { + $userManager->get($userId)?->delete(); + } + } + + protected function tearDown(): void { + parent::tearDown(); + + $circleService = $this->container->get(CircleService::class); + + foreach ($this->circlesToCleanup as $circleId) { + try { + $circleService->destroy($circleId); + } catch (\Throwable) { + // continue cleanup + } + } + } + + public function testCreate(): void { + $result = $this->adminController->create(self::TEST_USER_1, 'test-circle')->getData(); + $this->circlesToCleanup[] = $result['id']; + + $this->assertSame($result['name'], 'test-circle'); + $this->assertSame($result['population'], 0); + $this->assertSame($result['config'], 0); + $this->assertSame($result['initiator']['userId'], self::TEST_USER_1); + $this->assertSame($result['initiator']['level'], Member::LEVEL_OWNER); + $this->assertSame($result['owner']['userId'], self::TEST_USER_1); + } + + public function testDestroy(): void { + $circleService = $this->container->get(CircleService::class); + + $circleData = $circleService->create('test-circle'); + + $this->adminController->destroy(self::TEST_USER_1, $circleData['id']); + + $this->expectException(CircleNotFoundException::class); + + $circleService->getCircle($circleData['id']); + } + + public function testMemberAdd(): void { + $circleService = $this->container->get(CircleService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $result = $this->adminController->memberAdd(self::TEST_USER_1, $circleData['id'], self::TEST_USER_2, Member::TYPE_USER)->getData(); + + $this->assertSame($result['circleId'], $circleData['id']); + $this->assertSame($result['userId'], self::TEST_USER_2); + $this->assertSame($result['level'], Member::LEVEL_MEMBER); + } + + public function testMemberLevel(): void { + $circleService = $this->container->get(CircleService::class); + $federatedUserService = $this->container->get(FederatedUserService::class); + $memberService = $this->container->get(MemberService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $user2 = $federatedUserService->generateFederatedUser(self::TEST_USER_2, Member::TYPE_USER); + $memberData = $memberService->addMember($circleData['id'], $user2); + + $result = $this->adminController->memberLevel(self::TEST_USER_1, $circleData['id'], $memberData['id'], Member::LEVEL_MODERATOR)->getData(); + + $this->assertSame($result['circleId'], $circleData['id']); + $this->assertSame($result['userId'], self::TEST_USER_2); + $this->assertSame($result['level'], Member::LEVEL_MODERATOR); + } + + public function testCircles(): void { + $circleService = $this->container->get(CircleService::class); + + /** + * count before, as circles not created by this test may be returned + * by the controller (e.g. "visible to everyone" circles) + */ + $countBefore = count($this->adminController->circles(self::TEST_USER_1)->getData()); + + $circleData = $circleService->create('test-circle'); + $circleData2 = $circleService->create('test-circle-2'); + $circleData3 = $circleService->create('test-circle-3'); + $this->circlesToCleanup[] = $circleData['id']; + $this->circlesToCleanup[] = $circleData2['id']; + $this->circlesToCleanup[] = $circleData3['id']; + + $circleDataMap = [ + $circleData['id'] => $circleData, + $circleData2['id'] => $circleData2, + $circleData3['id'] => $circleData3, ]; + + $result = $this->adminController->circles(self::TEST_USER_1)->getData(); + + $this->assertCount($countBefore + 3, $result); + + foreach ($result as $circle) { + // skip circles that were not created by this test + if (!isset($circleDataMap[$circle['id']])) { + continue; + } + $this->assertSame($circle['id'], $circleDataMap[$circle['id']]['id']); + $this->assertSame($circle['name'], $circleDataMap[$circle['id']]['name']); + $this->assertSame($circle['config'], $circleDataMap[$circle['id']]['config']); + $this->assertSame($circle['initiator']['userId'], $circleDataMap[$circle['id']]['initiator']['userId']); + $this->assertSame($circle['initiator']['level'], $circleDataMap[$circle['id']]['initiator']['level']); + $this->assertSame($circle['owner']['userId'], $circleDataMap[$circle['id']]['owner']['userId']); + } + } + + public function testCircleDetails(): void { + $circleService = $this->container->get(CircleService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $result = $this->adminController->circleDetails(self::TEST_USER_1, $circleData['id'])->getData(); + + $this->assertSame($result['id'], $circleData['id']); + $this->assertSame($result['name'], $circleData['name']); + $this->assertSame($result['config'], $circleData['config']); + $this->assertSame($result['initiator']['userId'], $circleData['initiator']['userId']); + $this->assertSame($result['initiator']['level'], $circleData['initiator']['level']); + $this->assertSame($result['owner']['userId'], $circleData['owner']['userId']); + } + + public function testCircleJoin(): void { + $circleService = $this->container->get(CircleService::class); + $memberService = $this->container->get(MemberService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + // circle is visible to everyone and anyone can join + $circleConfig = Circle::CFG_VISIBLE + Circle::CFG_OPEN; + $circleService->updateConfig($circleData['id'], $circleConfig); + + $result = $this->adminController->circleJoin(self::TEST_USER_2, $circleData['id'])->getData(); + + /** @var Member $member */ + $member = $memberService->getMemberById($result['id'], $result['circleId']); + + $this->assertSame($result['id'], $member->getId()); + $this->assertSame($result['circleId'], $circleData['id']); + $this->assertSame($result['userId'], self::TEST_USER_2); + $this->assertSame($result['userType'], Member::TYPE_USER); + $this->assertSame($result['level'], Member::LEVEL_MEMBER); + } + + public function testCircleLeave(): void { + $circleService = $this->container->get(CircleService::class); + $federatedUserService = $this->container->get(FederatedUserService::class); + $memberService = $this->container->get(MemberService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + // circle is visible to everyone and anyone can join + $circleConfig = Circle::CFG_VISIBLE + Circle::CFG_OPEN; + $circleService->updateConfig($circleData['id'], $circleConfig); + + $user2 = $this->userManager->get(self::TEST_USER_2); + + $federatedUserService->setLocalCurrentUser($user2); + $memberData = $circleService->circleJoin($circleData['id']); + + $this->adminController->circleLeave(self::TEST_USER_2, $circleData['id'])->getData(); + + $this->expectException(MemberNotFoundException::class); + + $memberService->getMemberById($memberData['id'], $circleData['id']); + } + + public function testMemberConfirm(): void { + $circleService = $this->container->get(CircleService::class); + $federatedUserService = $this->container->get(FederatedUserService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + // circle is visible to everyone but requires approval to join + $circleConfig = Circle::CFG_VISIBLE + Circle::CFG_OPEN + Circle::CFG_REQUEST; + $circleService->updateConfig($circleData['id'], $circleConfig); + + $user1 = $this->userManager->get(self::TEST_USER_1); + $user2 = $this->userManager->get(self::TEST_USER_2); + + $federatedUserService->setLocalCurrentUser($user2); + $memberData = $circleService->circleJoin($circleData['id']); + + $federatedUserService->setLocalCurrentUser($user1); + + // as TEST_USER_1, allow TEST_USER_2 to be a member of the team + $result = $this->adminController->memberConfirm(self::TEST_USER_1, $circleData['id'], $memberData['id'])->getData(); + + $this->assertSame($result['id'], $memberData['id']); + $this->assertSame($result['circleId'], $circleData['id']); + $this->assertSame($result['userId'], self::TEST_USER_2); + $this->assertSame($result['userType'], Member::TYPE_USER); + $this->assertSame($result['level'], Member::LEVEL_MEMBER); + } + + public function testMemberRemove(): void { + $circleService = $this->container->get(CircleService::class); + $federatedUserService = $this->container->get(FederatedUserService::class); + $memberService = $this->container->get(MemberService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $user2 = $federatedUserService->generateFederatedUser(self::TEST_USER_2, Member::TYPE_USER); + $memberData = $memberService->addMember($circleData['id'], $user2); + + $this->adminController->memberRemove(self::TEST_USER_1, $circleData['id'], $memberData['id']); + + $this->expectException(MemberNotFoundException::class); + + $memberService->getMemberById($memberData['id'], $circleData['id']); + } + + public function testMembers(): void { + $circleService = $this->container->get(CircleService::class); + $federatedUserService = $this->container->get(FederatedUserService::class); + $memberService = $this->container->get(MemberService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $user2 = $federatedUserService->generateFederatedUser(self::TEST_USER_2, Member::TYPE_USER); + $memberService->addMember($circleData['id'], $user2); + + $result = $this->adminController->members(self::TEST_USER_1, $circleData['id'])->getData(); + + $this->assertCount(2, $result); + + $userIds = array_column($result, 'userId'); + $this->assertContains(self::TEST_USER_1, $userIds); + $this->assertContains(self::TEST_USER_2, $userIds); + + $circleIds = array_column($result, 'circleId'); + foreach ($circleIds as $circleId) { + $this->assertSame($circleId, $circleData['id']); + } + } + + public function testEditName(): void { + $circleService = $this->container->get(CircleService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $result = $this->adminController->editName(self::TEST_USER_1, $circleData['id'], 'test-cricle-new-name')->getData(); + + $this->assertSame($result['id'], $circleData['id']); + $this->assertSame($result['name'], 'test-cricle-new-name'); + } + + public function testEditDescription(): void { + $circleService = $this->container->get(CircleService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $result = $this->adminController->editDescription(self::TEST_USER_1, $circleData['id'], 'test-cricle-new-description')->getData(); + + $this->assertSame($result['id'], $circleData['id']); + $this->assertSame($result['description'], 'test-cricle-new-description'); + } + + public function testEditSetting(): void { + $circleService = $this->container->get(CircleService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $result = $this->adminController->editSetting(self::TEST_USER_1, $circleData['id'], ConfigService::MEMBERS_LIMIT, '25')->getData(); + + $this->assertSame($result['id'], $circleData['id']); + $this->assertSame($result['settings'][ConfigService::MEMBERS_LIMIT], '25'); + } + + public function testEditConfig(): void { + $circleService = $this->container->get(CircleService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $result = $this->adminController->editConfig(self::TEST_USER_1, $circleData['id'], 128)->getData(); + + $this->assertSame($result['id'], $circleData['id']); + $this->assertSame($result['config'], 128); + } + + public function testLink(): void { + $circleService = $this->container->get(CircleService::class); + $federatedUserService = $this->container->get(FederatedUserService::class); + $memberService = $this->container->get(MemberService::class); + + $circleData = $circleService->create('test-circle'); + $this->circlesToCleanup[] = $circleData['id']; + + $user2 = $federatedUserService->generateFederatedUser(self::TEST_USER_2, Member::TYPE_USER); + $memberData = $memberService->addMember($circleData['id'], $user2); + + // as TEST_USER_1, get membership details of TEST_USER_2 + $result = $this->adminController->link(self::TEST_USER_1, $circleData['id'], $memberData['singleId'])->getData(); + + $this->assertSame($result['circleId'], $circleData['id']); + $this->assertSame($result['singleId'], $memberData['singleId']); + $this->assertSame($result['level'], Member::LEVEL_MEMBER); + $this->assertSame($result['inheritanceDepth'], 1); } }