class TestPurgeComments(unittest.TestCase): def setUp(self): fd, self.path = tempfile.mkstemp() conf = config.load( pkg_resources.resource_filename('isso', 'defaults.ini')) conf.set("general", "dbpath", self.path) conf.set("moderation", "enabled", "true") conf.set("guard", "enabled", "off") conf.set("hash", "algorithm", "none") class App(Isso, core.Mixin): pass self.app = App(conf) self.app.wsgi_app = FakeIP(self.app.wsgi_app, "192.168.1.1") self.client = JSONClient(self.app, Response) def testPurgeDoesNoHarm(self): self.client.post('/new?uri=test', data=json.dumps({"text": "..."})) self.app.db.comments.activate(1) self.app.db.comments.purge(0) self.assertEqual(self.client.get('/?uri=test').status_code, 200) def testPurgeWorks(self): self.client.post('/new?uri=test', data=json.dumps({"text": "..."})) self.app.db.comments.purge(0) self.assertEqual(self.client.get('/id/1').status_code, 404) self.client.post('/new?uri=test', data=json.dumps({"text": "..."})) self.app.db.comments.purge(3600) self.assertEqual(self.client.get('/id/1').status_code, 200)
class TestModeratedComments(unittest.TestCase): def setUp(self): fd, self.path = tempfile.mkstemp() conf = config.load(os.path.join(dist.location, "share", "isso.conf")) conf.set("general", "dbpath", self.path) conf.set("moderation", "enabled", "true") conf.set("guard", "enabled", "off") conf.set("hash", "algorithm", "none") class App(Isso, core.Mixin): pass self.app = App(conf) self.app.wsgi_app = FakeIP(self.app.wsgi_app, "192.168.1.1") self.client = JSONClient(self.app, Response) def tearDown(self): os.unlink(self.path) def testAddComment(self): rv = self.client.post('/new?uri=test', data=json.dumps({"text": "..."})) self.assertEqual(rv.status_code, 202) self.assertEqual(self.client.get('/id/1').status_code, 200) self.assertEqual(self.client.get('/?uri=test').status_code, 404) self.app.db.comments.activate(1) self.assertEqual(self.client.get('/?uri=test').status_code, 200)
class TestModeratedComments(unittest.TestCase): def setUp(self): fd, self.path = tempfile.mkstemp() conf = config.load( pkg_resources.resource_filename('isso', 'defaults.ini')) conf.set("general", "dbpath", self.path) conf.set("moderation", "enabled", "true") conf.set("guard", "enabled", "off") conf.set("hash", "algorithm", "none") class App(Isso, core.Mixin): pass self.app = App(conf) self.app.wsgi_app = FakeIP(self.app.wsgi_app, "192.168.1.1") self.client = JSONClient(self.app, Response) def tearDown(self): os.unlink(self.path) def testAddComment(self): rv = self.client.post('/new?uri=test', data=json.dumps({"text": "..."})) self.assertEqual(rv.status_code, 202) self.assertEqual(self.client.get('/id/1').status_code, 200) self.assertEqual(self.client.get('/?uri=test').status_code, 200) data = loads(self.client.get('/?uri=test').data) self.assertEqual(len(data['replies']), 0) self.app.db.comments.activate(1) self.assertEqual(self.client.get('/?uri=test').status_code, 200)
def testDeleteWithReference(self): client = JSONClient(self.app, Response) client.post('/new?uri=%2Fpath%2F', data=json.dumps({'text': 'First'})) client.post('/new?uri=%2Fpath%2F', data=json.dumps({ 'text': 'First', 'parent': 1 })) r = client.delete('/id/1') self.assertEqual(r.status_code, 200) self.assertEqual(loads(r.data)['mode'], 4) self.assertIn('/path/', self.app.db.threads) data = loads(client.get("/?uri=%2Fpath%2F").data) self.assertEqual(data["total_replies"], 1) self.assertEqual(self.get('/?uri=%2Fpath%2F&id=1').status_code, 200) self.assertEqual(self.get('/?uri=%2Fpath%2F&id=2').status_code, 200) r = client.delete('/id/2') self.assertEqual(self.get('/?uri=%2Fpath%2F').status_code, 200) self.assertNotIn('/path/', self.app.db.threads) data = loads(client.get('/?uri=%2Fpath%2F').data) self.assertEqual(len(data['replies']), 0)
class TestPurgeComments(unittest.TestCase): def setUp(self): fd, self.path = tempfile.mkstemp() conf = core.Config.load(None) conf.set("general", "dbpath", self.path) conf.set("moderation", "enabled", "true") conf.set("guard", "enabled", "off") class App(Isso, core.Mixin): pass self.app = App(conf) self.app.wsgi_app = FakeIP(self.app.wsgi_app, "192.168.1.1") self.client = JSONClient(self.app, Response) def testPurgeDoesNoHarm(self): self.client.post('/new?uri=test', data=json.dumps({"text": "..."})) self.app.db.comments.activate(1) self.app.db.comments.purge(0) assert self.client.get('/?uri=test').status_code == 200 def testPurgeWorks(self): self.client.post('/new?uri=test', data=json.dumps({"text": "..."})) self.app.db.comments.purge(0) assert self.client.get('/id/1').status_code == 404 self.client.post('/new?uri=test', data=json.dumps({"text": "..."})) self.app.db.comments.purge(3600) assert self.client.get('/id/1').status_code == 200
class TestModeratedComments(unittest.TestCase): def setUp(self): fd, self.path = tempfile.mkstemp() conf = core.Config.load(None) conf.set("general", "dbpath", self.path) conf.set("moderation", "enabled", "true") conf.set("guard", "enabled", "off") class App(Isso, core.Mixin): pass self.app = App(conf) self.app.wsgi_app = FakeIP(self.app.wsgi_app, "192.168.1.1") self.client = JSONClient(self.app, Response) def tearDown(self): os.unlink(self.path) def testAddComment(self): rv = self.client.post('/new?uri=test', data=json.dumps({"text": "..."})) self.assertEqual(rv.status_code, 202) self.assertEqual(self.client.get('/id/1').status_code, 200) self.assertEqual(self.client.get('/?uri=test').status_code, 404) self.app.db.comments.activate(1) self.assertEqual(self.client.get('/?uri=test').status_code, 200)
def testDeleteWithMultipleReferences(self): """ [ comment 1 ] | --- [ comment 2, ref 1 ] | --- [ comment 3, ref 1 ] [ comment 4 ] """ client = JSONClient(self.app, Response) client.post('/new?uri=%2Fpath%2F', data=json.dumps({'text': 'First'})) client.post('/new?uri=%2Fpath%2F', data=json.dumps({ 'text': 'Second', 'parent': 1 })) client.post('/new?uri=%2Fpath%2F', data=json.dumps({ 'text': 'Third', 'parent': 1 })) client.post('/new?uri=%2Fpath%2F', data=json.dumps({'text': 'Last'})) client.delete('/id/1') self.assertEqual(self.get('/?uri=%2Fpath%2F').status_code, 200) client.delete('/id/2') self.assertEqual(self.get('/?uri=%2Fpath%2F').status_code, 200) client.delete('/id/3') self.assertEqual(self.get('/?uri=%2Fpath%2F').status_code, 200) client.delete('/id/4') self.assertEqual(self.get('/?uri=%2Fpath%2F').status_code, 200) data = loads(client.get('/?uri=%2Fpath%2F').data) self.assertEqual(len(data['replies']), 0)
class TestUnsubscribe(unittest.TestCase): def setUp(self): fd, self.path = tempfile.mkstemp() conf = config.load(config.default_file()) conf.set("general", "dbpath", self.path) conf.set("moderation", "enabled", "true") conf.set("guard", "enabled", "off") conf.set("hash", "algorithm", "none") class App(Isso, core.Mixin): pass self.app = App(conf) self.app.wsgi_app = FakeIP(self.app.wsgi_app, "192.168.1.1") self.client = JSONClient(self.app, Response) # add default comment rv = self.client.post( '/new?uri=test', data=json.dumps({"text": "..."})) self.assertEqual(rv.status_code, 202) def tearDown(self): os.unlink(self.path) def testUnsubscribe(self): id_ = 1 email = "*****@*****.**" key = self.app.sign(('unsubscribe', email)) # GET should return some html form rv_unsubscribe_get = self.client.get('/id/%d/unsubscribe/%s/%s' % (id_, email, key)) self.assertEqual(rv_unsubscribe_get.status_code, 200) self.assertIn(b"Successfully unsubscribed", rv_unsubscribe_get.data) # Incomplete key should fail key = self.app.sign(['unsubscribe']) rv_incomplete_key = self.client.get('/id/%d/unsubscribe/%s/%s' % (id_, email, key)) self.assertEqual(rv_incomplete_key.status_code, 403) # Wrong key type should fail key = self.app.sign(1) rv_wrong_key_type = self.client.get('/id/%d/unsubscribe/%s/%s' % (id_, email, key)) self.assertEqual(rv_wrong_key_type.status_code, 403)
def testDeleteWithReference(self): client = JSONClient(self.app, Response) client.post('/new?uri=%2Fpath%2F', data=json.dumps({'text': 'First'})) client.post('/new?uri=%2Fpath%2F', data=json.dumps({'text': 'First', 'parent': 1})) r = client.delete('/id/1') self.assertEqual(r.status_code, 200) self.assertEqual(loads(r.data)['mode'], 4) self.assertIn('/path/', self.app.db.threads) data = loads(client.get("/?uri=%2Fpath%2F").data) self.assertEqual(data["total_replies"], 1) self.assertEqual(self.get('/?uri=%2Fpath%2F&id=1').status_code, 200) self.assertEqual(self.get('/?uri=%2Fpath%2F&id=2').status_code, 200) r = client.delete('/id/2') self.assertEqual(self.get('/?uri=%2Fpath%2F').status_code, 404) self.assertNotIn('/path/', self.app.db.threads)
class TestModeratedComments(unittest.TestCase): def setUp(self): fd, self.path = tempfile.mkstemp() conf = config.load(config.default_file()) conf.set("general", "dbpath", self.path) conf.set("moderation", "enabled", "true") conf.set("guard", "enabled", "off") conf.set("hash", "algorithm", "none") class App(Isso, core.Mixin): pass self.app = App(conf) self.app.wsgi_app = FakeIP(self.app.wsgi_app, "192.168.1.1") self.client = JSONClient(self.app, Response) def tearDown(self): os.unlink(self.path) def testAddComment(self): rv = self.client.post( '/new?uri=test', data=json.dumps({"text": "..."})) self.assertEqual(rv.status_code, 202) self.assertEqual(self.client.get('/id/1').status_code, 200) self.assertEqual(self.client.get('/?uri=test').status_code, 200) data = loads(self.client.get('/?uri=test').data) self.assertEqual(len(data['replies']), 0) self.app.db.comments.activate(1) self.assertEqual(self.client.get('/?uri=test').status_code, 200) def testModerateComment(self): id_ = 1 signed = self.app.sign(id_) # Create new comment, should have mode=2 (pending moderation) rv = self.client.post( '/new?uri=/moderated', data=json.dumps({"text": "..."})) self.assertEqual(rv.status_code, 202) self.assertEqual(self.client.get('/id/1').status_code, 200) self.assertEqual(self.app.db.comments.get(id_)["mode"], 2) self.assertEqual(self.app.db.comments.get(id_)["text"], "...") # GET should return some html form action = "activate" rv_activate_get = self.client.get('/id/%d/%s/%s' % (id_, action, signed)) self.assertEqual(rv_activate_get.status_code, 200) self.assertIn(b"Activate: Are you sure?", rv_activate_get.data) self.assertIn(b"http://invalid.local/moderated#isso-1", rv_activate_get.data) # Activate comment action = "activate" rv_activated = self.client.post('/id/%d/%s/%s' % (id_, action, signed)) self.assertEqual(rv_activated.status_code, 200) self.assertEqual(rv_activated.data, b"Comment has been activated") # Activating should be idempotent rv_activated = self.client.post('/id/%d/%s/%s' % (id_, action, signed)) self.assertEqual(rv_activated.status_code, 200) self.assertEqual(rv_activated.data, b"Already activated") # Comment should have mode=1 (activated) self.assertEqual(self.app.db.comments.get(id_)["mode"], 1) # Edit comment action = "edit" rv_edit = self.client.post('/id/%d/%s/%s' % (id_, action, signed), data=json.dumps({"text": "new text"})) self.assertEqual(rv_edit.status_code, 200) self.assertEqual(json.loads(rv_edit.data)["id"], id_) self.assertEqual(self.app.db.comments.get(id_)["text"], "new text") # Wrong action on comment is handled by the routing action = "foo" rv_wrong_action = self.client.post('/id/%d/%s/%s' % (id_, action, signed)) self.assertEqual(rv_wrong_action.status_code, 404) # Delete comment action = "delete" rv_deleted = self.client.post('/id/%d/%s/%s' % (id_, action, signed)) self.assertEqual(rv_deleted.status_code, 200) self.assertEqual(rv_deleted.data, b"Comment has been deleted") # Comment should no longer exist self.assertEqual(self.app.db.comments.get(id_), None)