From a99e0d93f082e534ec126bc2752a0e45d8f06463 Mon Sep 17 00:00:00 2001 From: Marcin Kurczewski Date: Tue, 13 May 2014 21:44:41 +0200 Subject: [PATCH] Added tests for post list sort styles --- tests/Tests/JobTests/ListPostsJobTest.php | 348 ++++++++++++++++------ 1 file changed, 254 insertions(+), 94 deletions(-) diff --git a/tests/Tests/JobTests/ListPostsJobTest.php b/tests/Tests/JobTests/ListPostsJobTest.php index feb8b815..9751cf8e 100644 --- a/tests/Tests/JobTests/ListPostsJobTest.php +++ b/tests/Tests/JobTests/ListPostsJobTest.php @@ -28,6 +28,16 @@ class ListPostsJobTest extends AbstractTest $this->assert->areEqual(2, $ret->page); } + public function testTooManyTokens() + { + $this->grantAccess('listPosts'); + + $this->assert->throws(function() + { + Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => 't1 t2 t3 t4 t5 t6 t7']); + }, 'too many search tokens'); + } + public function testAutomaticSafetyFilterOnlySafeEnabled() { $user = $this->userMocker->mockSingle(); @@ -41,11 +51,7 @@ class ListPostsJobTest extends AbstractTest $this->grantAccess('listPosts.sketchy'); $this->revokeAccess('listPosts.unsafe'); - $posts = $this->postMocker->mockMultiple(3); - $posts[0]->setSafety(new PostSafety(PostSafety::Safe)); - $posts[1]->setSafety(new PostSafety(PostSafety::Sketchy)); - $posts[2]->setSafety(new PostSafety(PostSafety::Unsafe)); - PostModel::save($posts); + $posts = $this->preparePostsWithSafety(); $ret = $this->assert->doesNotThrow(function() { @@ -72,11 +78,7 @@ class ListPostsJobTest extends AbstractTest $this->grantAccess('listPosts.sketchy'); $this->revokeAccess('listPosts.unsafe'); - $posts = $this->postMocker->mockMultiple(3); - $posts[0]->setSafety(new PostSafety(PostSafety::Safe)); - $posts[1]->setSafety(new PostSafety(PostSafety::Sketchy)); - $posts[2]->setSafety(new PostSafety(PostSafety::Unsafe)); - PostModel::save($posts); + $posts = $this->preparePostsWithSafety(); $ret = $this->assert->doesNotThrow(function() { @@ -282,19 +284,18 @@ class ListPostsJobTest extends AbstractTest public function testUploads() { $this->grantAccess('listPosts'); - $user1 = $this->userMocker->mockSingle(); - $user2 = $this->userMocker->mockSingle(); + $users = $this->userMocker->mockMultiple(2); $posts = $this->postMocker->mockMultiple(3); - $posts[0]->setUploader($user1); - $posts[1]->setUploader($user2); - $posts[2]->setUploader($user1); + $posts[0]->setUploader($users[0]); + $posts[1]->setUploader($users[1]); + $posts[2]->setUploader($users[0]); PostModel::save($posts); foreach (['submit', 'upload', 'uploads', 'uploader', 'uploaded'] as $alias) { - $ret = $this->assert->doesNotThrow(function() use ($alias, $user1) + $ret = $this->assert->doesNotThrow(function() use ($alias, $users) { - return Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => $alias . ':' . $user1->getName()]); + return Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => $alias . ':' . $users[0]->getName()]); }); $this->assert->areEqual(2, $ret->entityCount); @@ -336,13 +337,7 @@ class ListPostsJobTest extends AbstractTest public function testScoreMinMax() { $this->grantAccess('listPosts'); - $posts = $this->postMocker->mockMultiple(3); - - $user1 = $this->userMocker->mockSingle(); - $user2 = $this->userMocker->mockSingle(); - UserModel::updateUserScore($user1, $posts[0], 1); - UserModel::updateUserScore($user2, $posts[0], 1); - UserModel::updateUserScore($user1, $posts[2], 1); + $posts = $this->preparePostsWithScores(); foreach (['scoremin', 'score_min'] as $alias) { @@ -372,13 +367,7 @@ class ListPostsJobTest extends AbstractTest public function testFavMinMax() { $this->grantAccess('listPosts'); - $posts = $this->postMocker->mockMultiple(3); - - $user1 = $this->userMocker->mockSingle(); - $user2 = $this->userMocker->mockSingle(); - UserModel::addToUserFavorites($user1, $posts[0]); - UserModel::addToUserFavorites($user2, $posts[0]); - UserModel::addToUserFavorites($user1, $posts[2]); + $posts = $this->preparePostsWithFavs(); foreach (['favmin', 'fav_min'] as $alias) { @@ -408,19 +397,7 @@ class ListPostsJobTest extends AbstractTest public function testCommentMinMax() { $this->grantAccess('listPosts'); - $posts = $this->postMocker->mockMultiple(3); - - $comment1 = CommentModel::spawn(); - $comment2 = CommentModel::spawn(); - $comment3 = CommentModel::spawn(); - $comment1->setPost($posts[0]); - $comment2->setPost($posts[0]); - $comment3->setPost($posts[2]); - foreach ([$comment1, $comment2, $comment3] as $comment) - { - $comment->setText('alohaaa'); - CommentModel::save($comment); - } + $posts = $this->preparePostsWithComments(); foreach (['commentmin', 'comment_min'] as $alias) { @@ -450,11 +427,7 @@ class ListPostsJobTest extends AbstractTest public function testTagMinMax() { $this->grantAccess('listPosts'); - $posts = $this->postMocker->mockMultiple(3); - $posts[0]->setTags(TagModel::spawnFromNames(['tag1', 'tag2', 'tag3'])); - $posts[1]->setTags(TagModel::spawnFromNames(['tag1'])); - $posts[2]->setTags(TagModel::spawnFromNames(['tag1', 'tag2'])); - PostModel::save($posts); + $posts = $this->preparePostsWithTags(); foreach (['tagmin', 'tag_min'] as $alias) { @@ -464,7 +437,7 @@ class ListPostsJobTest extends AbstractTest }); $this->assert->areEqual(2, $ret->entityCount); - $this->assert->areEqual($posts[2]->getId(), $ret->entities[0]->getId()); + $this->assert->areEqual($posts[1]->getId(), $ret->entities[0]->getId()); $this->assert->areEqual($posts[0]->getId(), $ret->entities[1]->getId()); } @@ -481,14 +454,10 @@ class ListPostsJobTest extends AbstractTest } } - public function testDateMinMax() + public function testDate() { $this->grantAccess('listPosts'); - $posts = $this->postMocker->mockMultiple(3); - $posts[0]->setCreationTime(mktime(0, 0, 0, 10, 23, 1990)); - $posts[1]->setCreationTime(mktime(0, 0, 0, 10, 22, 1990)); - $posts[2]->setCreationTime(mktime(0, 0, 0, 10, 21, 1990)); - PostModel::save($posts); + $posts = $this->preparePostsWithDates(); $ret = $this->assert->doesNotThrow(function() { @@ -496,7 +465,13 @@ class ListPostsJobTest extends AbstractTest }); $this->assert->areEqual(1, $ret->entityCount); - $this->assert->areEqual($posts[1]->getId(), $ret->entities[0]->getId()); + $this->assert->areEqual($posts[2]->getId(), $ret->entities[0]->getId()); + } + + public function testDateMinMax() + { + $this->grantAccess('listPosts'); + $posts = $this->preparePostsWithDates(); foreach (['datemin', 'date_min'] as $alias) { @@ -506,7 +481,7 @@ class ListPostsJobTest extends AbstractTest }); $this->assert->areEqual(2, $ret->entityCount); - $this->assert->areEqual($posts[1]->getId(), $ret->entities[0]->getId()); + $this->assert->areEqual($posts[2]->getId(), $ret->entities[0]->getId()); $this->assert->areEqual($posts[0]->getId(), $ret->entities[1]->getId()); } @@ -533,35 +508,10 @@ class ListPostsJobTest extends AbstractTest }, 'invalid'); } - public function testInvalidType() - { - $this->grantAccess('listPosts'); - - $this->assert->throws(function() - { - Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => 'type:nonsense']); - }, 'invalid'); - } - - public function testTooManyTokens() - { - $this->grantAccess('listPosts'); - - $this->assert->throws(function() - { - Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => 't1 t2 t3 t4 t5 t6 t7']); - }, 'too many search tokens'); - } - public function testTypes() { $this->grantAccess('listPosts'); - $posts = $this->postMocker->mockMultiple(4); - $posts[0]->setType(new PostType(PostType::Image)); - $posts[1]->setType(new PostType(PostType::Video)); - $posts[2]->setType(new PostType(PostType::Youtube)); - $posts[3]->setType(new PostType(PostType::Flash)); - PostModel::save($posts); + $posts = $this->preparePostsWithTypes(); $ret = $this->assert->doesNotThrow(function() { @@ -605,14 +555,20 @@ class ListPostsJobTest extends AbstractTest } } + public function testInvalidType() + { + $this->grantAccess('listPosts'); + + $this->assert->throws(function() + { + Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => 'type:nonsense']); + }, 'invalid'); + } + public function testMultipleTags() { $this->grantAccess('listPosts'); - $posts = $this->postMocker->mockMultiple(3); - $posts[0]->setTags(TagModel::spawnFromNames(['tag1', 'tag2', 'tag3'])); - $posts[1]->setTags(TagModel::spawnFromNames(['tag1', 'tag2'])); - $posts[2]->setTags(TagModel::spawnFromNames(['tag1'])); - PostModel::save($posts); + $posts = $this->preparePostsWithTags(); $ret = $this->assert->doesNotThrow(function() { @@ -627,11 +583,7 @@ class ListPostsJobTest extends AbstractTest public function testTagNegation() { $this->grantAccess('listPosts'); - $posts = $this->postMocker->mockMultiple(3); - $posts[0]->setTags(TagModel::spawnFromNames(['tag1', 'tag2', 'tag3'])); - $posts[1]->setTags(TagModel::spawnFromNames(['tag1', 'tag2'])); - $posts[2]->setTags(TagModel::spawnFromNames(['tag1'])); - PostModel::save($posts); + $posts = $this->preparePostsWithTags(); $ret = $this->assert->doesNotThrow(function() { @@ -641,4 +593,212 @@ class ListPostsJobTest extends AbstractTest $this->assert->areEqual(1, $ret->entityCount); $this->assert->areEqual($posts[1]->getId(), $ret->entities[0]->getId()); } + + public function testOrderById() + { + $this->grantAccess('listPosts'); + $posts = $this->preparePostsWithTags(); + + $this->testOrder('order:id', [$posts[2], $posts[1], $posts[0]]); + } + + public function testOrderByFavCount() + { + $this->grantAccess('listPosts'); + $posts = $this->preparePostsWithFavs(); + + foreach (['fav', 'favs', 'favcount', 'fav_count'] as $alias) + $this->testOrder('order:' . $alias, [$posts[0], $posts[2], $posts[1]]); + } + + public function testOrderByCommentCount() + { + $this->grantAccess('listPosts'); + $posts = $this->preparePostsWithComments(); + + foreach (['comment', 'comments', 'commentcount', 'comment_count'] as $alias) + $this->testOrder('order:' . $alias, [$posts[0], $posts[2], $posts[1]]); + } + + public function testOrderByScores() + { + $this->grantAccess('listPosts'); + $posts = $this->preparePostsWithScores(); + + $this->testOrder('order:score', [$posts[0], $posts[2], $posts[1]]); + } + + public function testOrderByDates() + { + $this->grantAccess('listPosts'); + $posts = $this->preparePostsWithDates(); + + $this->testOrder('order:date', [$posts[0], $posts[2], $posts[1]]); + } + + public function testOrderByCommentDates() + { + $this->grantAccess('listPosts'); + $posts = $this->preparePostsWithComments(); + + foreach (['commentdate', 'comment_date'] as $alias) + $this->testOrder('order:' . $alias, [$posts[2], $posts[0], $posts[1]]); + } + + public function testOrderByFavDates() + { + $this->grantAccess('listPosts'); + $posts = $this->preparePostsWithFavs(); + + foreach (['favdate', 'fav_date'] as $alias) + $this->testOrder('order:' . $alias, [$posts[2], $posts[0], $posts[1]]); + } + + public function testOrderByFilesize() + { + $this->grantAccess('listPosts'); + $posts = $this->postMocker->mockMultiple(3); + $posts[0]->setFileSize(100); + $posts[1]->setFileSize(50); + $posts[2]->setFileSize(300); + PostModel::save($posts); + + foreach (['filesize', 'file_size'] as $alias) + $this->testOrder('order:' . $alias, [$posts[2], $posts[0], $posts[1]]); + } + + public function testOrderByRandom() + { + $this->grantAccess('listPosts'); + $num = 15; + $posts = $this->postMocker->mockMultiple($num); + $expectedPostIdsSorted = range(1, $num); + + $ret = $this->assert->doesNotThrow(function() + { + return Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => 'order:random']); + }); + $postIds1 = array_map(function($x) { return $x->getId(); }, $ret->entities); + + $this->assert->areNotEquivalent($expectedPostIdsSorted, $postIds1); + $postIds1Sorted = $postIds1 + []; + sort($postIds1Sorted); + $this->assert->areEquivalent($expectedPostIdsSorted, $postIds1Sorted); + + $ret = $this->assert->doesNotThrow(function() + { + return Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => 'order:random']); + }); + $postIds2 = array_map(function($x) { return $x->getId(); }, $ret->entities); + $this->assert->areEquivalent($postIds1, $postIds2); + } + + + public function testInvalidOrderToken() + { + $this->grantAccess('listPosts'); + + $this->assert->throws(function() + { + Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => 'order:nonsense']); + }, 'invalid'); + } + + + private function testOrder($query, $expectedPosts) + { + $ret = $this->assert->doesNotThrow(function() use ($query) + { + return Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => $query]); + }); + + $this->assert->areEqual(count($expectedPosts), $ret->entityCount); + foreach ($expectedPosts as $i => $expectedPost) + $this->assert->areEqual($expectedPost->getId(), $ret->entities[$i]->getId()); + + $expectedPosts = array_reverse($expectedPosts); + + $ret = $this->assert->doesNotThrow(function() use ($query) + { + return Api::run(new ListPostsJob(), [JobArgs::ARG_QUERY => '-' . $query]); + }); + + $this->assert->areEqual(count($expectedPosts), $ret->entityCount); + foreach ($expectedPosts as $i => $expectedPost) + $this->assert->areEqual($expectedPost->getId(), $ret->entities[$i]->getId()); + } + + private function preparePostsWithScores() + { + $posts = $this->postMocker->mockMultiple(3); + $users = $this->userMocker->mockMultiple(2); + UserModel::updateUserScore($users[0], $posts[0], 1); + UserModel::updateUserScore($users[1], $posts[0], 1); + UserModel::updateUserScore($users[0], $posts[2], 1); + return $posts; + } + + private function preparePostsWithSafety() + { + $posts = $this->postMocker->mockMultiple(3); + $posts[0]->setSafety(new PostSafety(PostSafety::Safe)); + $posts[1]->setSafety(new PostSafety(PostSafety::Sketchy)); + $posts[2]->setSafety(new PostSafety(PostSafety::Unsafe)); + return PostModel::save($posts); + } + + private function preparePostsWithTypes() + { + $posts = $this->postMocker->mockMultiple(4); + $posts[0]->setType(new PostType(PostType::Image)); + $posts[1]->setType(new PostType(PostType::Video)); + $posts[2]->setType(new PostType(PostType::Youtube)); + $posts[3]->setType(new PostType(PostType::Flash)); + return PostModel::save($posts); + } + + private function preparePostsWithTags() + { + $posts = $this->postMocker->mockMultiple(3); + $posts[0]->setTags(TagModel::spawnFromNames(['tag1', 'tag2', 'tag3'])); + $posts[1]->setTags(TagModel::spawnFromNames(['tag1', 'tag2'])); + $posts[2]->setTags(TagModel::spawnFromNames(['tag1'])); + return PostModel::save($posts); + } + + private function preparePostsWithFavs() + { + $posts = $this->postMocker->mockMultiple(3); + $users = $this->userMocker->mockMultiple(2); + UserModel::addToUserFavorites($users[0], $posts[0]); + UserModel::addToUserFavorites($users[1], $posts[0]); + UserModel::addToUserFavorites($users[0], $posts[2]); + return $posts; + } + + private function preparePostsWithComments() + { + $posts = $this->postMocker->mockMultiple(3); + $comment1 = CommentModel::spawn(); + $comment2 = CommentModel::spawn(); + $comment3 = CommentModel::spawn(); + $comment1->setPost($posts[0]); + $comment2->setPost($posts[0]); + $comment3->setPost($posts[2]); + foreach ([$comment1, $comment2, $comment3] as $comment) + { + $comment->setText('alohaaa'); + CommentModel::save($comment); + } + return $posts; + } + + private function preparePostsWithDates() + { + $posts = $this->postMocker->mockMultiple(3); + $posts[0]->setCreationTime(mktime(0, 0, 0, 10, 23, 1990)); + $posts[1]->setCreationTime(mktime(0, 0, 0, 10, 21, 1990)); + $posts[2]->setCreationTime(mktime(0, 0, 0, 10, 22, 1990)); + return PostModel::save($posts); + } }