diff options
-rw-r--r-- | src/SemanticScuttle/Service/Vote.php | 41 | ||||
-rw-r--r-- | tests/VoteTest.php | 127 |
2 files changed, 163 insertions, 5 deletions
diff --git a/src/SemanticScuttle/Service/Vote.php b/src/SemanticScuttle/Service/Vote.php index 89088f0..c0c4995 100644 --- a/src/SemanticScuttle/Service/Vote.php +++ b/src/SemanticScuttle/Service/Vote.php @@ -225,12 +225,12 @@ class SemanticScuttle_Service_Vote extends SemanticScuttle_DbService return false; } - if ($this->hasVoted($bookmark, $user)) { + if ($vote != -1 && $vote != 1) { return false; } - if ($vote != -1 && $vote != 1) { - return false; + if ($this->hasVoted($bookmark, $user)) { + $this->removeVote($bookmark, $user); } $res = $this->db->sql_query( @@ -258,6 +258,41 @@ class SemanticScuttle_Service_Vote extends SemanticScuttle_DbService /** + * Removes a vote from the database + * + * @param integer $bookmark Bookmark ID + * @param integer $user User ID + * + * @return boolean True if all went well, false if not + */ + protected function removeVote($bookmark, $user) + { + $vote = $this->getVote($bookmark, $user); + if ($vote === null) { + return false; + } + + //remove from votes table + $query = 'DELETE FROM ' . $this->getTableName() + . ' WHERE bId = ' . (int)$bookmark + . ' AND uId = ' . (int)$user; + $this->db->sql_query($query); + + //change voting sum in bookmarks table + $bm = SemanticScuttle_Service_Factory::get('Bookmark'); + $res = $this->db->sql_query( + $sql='UPDATE ' . $bm->getTableName() + . ' SET bVoting = bVoting - ' . (int)$vote + . ' WHERE bId = ' . (int)$bookmark + ); + $this->db->sql_freeresult($res); + + return true; + } + + + + /** * Re-calculates all votings for all bookmarks * and updates the voting values in the bookmarks * table. diff --git a/tests/VoteTest.php b/tests/VoteTest.php index 9d6d904..b211dcd 100644 --- a/tests/VoteTest.php +++ b/tests/VoteTest.php @@ -35,6 +35,13 @@ class VoteTest extends TestBase */ protected $vs = null; + /** + * Bookmark service instance. + * + * @var SemanticScuttle_Service_Bookmark + */ + protected $bs = null; + /** @@ -293,11 +300,11 @@ class VoteTest extends TestBase $uid = 1; $bid = $this->addBookmark(); $this->assertTrue($this->vs->vote($bid, $uid, 1)); - $this->assertFalse($this->vs->vote($bid, $uid, 1)); + $this->assertTrue($this->vs->vote($bid, $uid, 1)); $bid = $this->addBookmark(); $this->assertTrue($this->vs->vote($bid, $uid, -1)); - $this->assertFalse($this->vs->vote($bid, $uid, 1)); + $this->assertTrue($this->vs->vote($bid, $uid, 1)); } @@ -333,6 +340,122 @@ class VoteTest extends TestBase /** + * Verify that changing the vote from positive to negative + * works. + * + * @return void + */ + public function testVoteChangePosNeg() + { + $uid = 1; + $bid = $this->addBookmark(); + + $this->assertTrue($this->vs->vote($bid, $uid, 1)); + $this->assertEquals(1, $this->vs->getVote($bid, $uid)); + $this->assertEquals(1, $this->vs->getVotes($bid)); + + $b = $this->bs->getBookmark($bid); + $this->assertEquals(1, $b['bVoting']); + + //change vote + $this->assertTrue($this->vs->vote($bid, $uid, -1)); + $this->assertEquals(-1, $this->vs->getVote($bid, $uid)); + $this->assertEquals(1, $this->vs->getVotes($bid)); + + $b = $this->bs->getBookmark($bid); + $this->assertEquals(-1, $b['bVoting']); + } + + + + /** + * Verify that changing the vote from negative to positive + * works. + * + * @return void + */ + public function testVoteChangeNegPos() + { + $uid = 1; + $bid = $this->addBookmark(); + + $this->assertTrue($this->vs->vote($bid, $uid, -1)); + $this->assertEquals(-1, $this->vs->getVote($bid, $uid)); + $this->assertEquals(1, $this->vs->getVotes($bid)); + + $b = $this->bs->getBookmark($bid); + $this->assertEquals(-1, $b['bVoting']); + + //change vote + $this->assertTrue($this->vs->vote($bid, $uid, 1)); + $this->assertEquals(1, $this->vs->getVote($bid, $uid)); + $this->assertEquals(1, $this->vs->getVotes($bid)); + + $b = $this->bs->getBookmark($bid); + $this->assertEquals(1, $b['bVoting']); + } + + + + /** + * Verify that changing the vote from postitive to positive + * has no strange effects + * + * @return void + */ + public function testVoteChangePosPos() + { + $uid = 1; + $bid = $this->addBookmark(); + + $this->assertTrue($this->vs->vote($bid, $uid, 1)); + $this->assertEquals(1, $this->vs->getVote($bid, $uid)); + $this->assertEquals(1, $this->vs->getVotes($bid)); + + $b = $this->bs->getBookmark($bid); + $this->assertEquals(1, $b['bVoting']); + + //change vote + $this->assertTrue($this->vs->vote($bid, $uid, 1)); + $this->assertEquals(1, $this->vs->getVote($bid, $uid)); + $this->assertEquals(1, $this->vs->getVotes($bid)); + + $b = $this->bs->getBookmark($bid); + $this->assertEquals(1, $b['bVoting']); + } + + + + /** + * Verify that changing the vote from postitive to positive + * has no strange effects + * + * @return void + */ + public function testVoteChangeNegNeg() + { + $uid = 1; + $bid = $this->addBookmark(); + + $this->assertTrue($this->vs->vote($bid, $uid, -1)); + $this->assertEquals(-1, $this->vs->getVote($bid, $uid)); + $this->assertEquals(1, $this->vs->getVotes($bid)); + + $b = $this->bs->getBookmark($bid); + $this->assertEquals(-1, $b['bVoting']); + + //change vote to same value + $this->assertTrue($this->vs->vote($bid, $uid, -1)); + $this->assertEquals(-1, $this->vs->getVote($bid, $uid)); + $this->assertEquals(1, $this->vs->getVotes($bid)); + + $b = $this->bs->getBookmark($bid); + $this->assertEquals(-1, $b['bVoting']); + } + + + + /** * Test that rewriting votings does work * * @return void |