def test_load(self): response = self.get('api.load', 'i18n://sv-se@page/title') self.assertEqual(response.status_code, 200) json_content = json.loads(response.content) self.assertEqual(json_content['uri'], 'i18n://sv-se@page/title.txt') self.assertIsNone(json_content['data']) self.assertEqual(len(json_content['meta'].keys()), 0) # TODO: Should get 404 # response = self.get('api.load', 'i18n://sv-se@page/title#1') # self.assertEqual(response.status_code, 404) cio.set('i18n://sv-se@page/title.md', u'# Djedi') response = self.get('api.load', 'sv-se@page/title') self.assertEqual(response.status_code, 200) node = json_node(response, simple=False) meta = node.pop('meta', {}) self.assertDictEqual(node, {'uri': 'i18n://sv-se@page/title.md#1', 'data': u'# Djedi', 'content': u'<h1>Djedi</h1>'}) self.assertKeys(meta, 'modified_at', 'published_at', 'is_published') response = self.get('api.load', 'i18n://sv-se@page/title#1') json_content = json.loads(response.content) self.assertEqual(json_content['uri'], 'i18n://sv-se@page/title.md#1') self.assertEqual(len(cio.revisions('i18n://sv-se@page/title')), 1)
def get(self, request, uri): """ List uri revisions. JSON Response: [[uri, state], ...] """ uri = self.decode_uri(uri) revisions = cio.revisions(uri) revisions = [list(revision) for revision in revisions] # Convert tuples to lists return self.render_to_json(revisions)
def assertRevisions(*revs): revisions = set(cio.revisions('i18n://sv-se@page/title')) assert revisions == set(revs)
def test_revisions(self): def assertRevisions(*revs): revisions = set(cio.revisions('i18n://sv-se@page/title')) assert revisions == set(revs) self.assertEqual(len(set(cio.revisions('i18n://sv-se@page/title'))), 0) node = cio.load('sv-se@page/title') self.assertDictEqual(node, { 'uri': 'i18n://sv-se@page/title.txt', 'data': None, 'content': None, 'meta': {} }) # First draft with self.assertDB(selects=1, inserts=1, updates=0): with self.assertCache(calls=0): node = cio.set('i18n://sv-se@page/title.txt', u'Content-IO', publish=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.txt#draft') assertRevisions(('i18n://sv-se@page/title.txt#draft', False)) self.assertIsNone(cio.get('page/title').content) # Publish first draft, version 1 with self.assertDB(calls=4, selects=2, updates=2): with self.assertCache(calls=1, sets=1): node = cio.publish(node.uri) self.assertEqual(node.uri, 'i18n://sv-se@page/title.txt#1') assertRevisions(('i18n://sv-se@page/title.txt#1', True)) self.assertEqual(cio.get('page/title').content, u'Content-IO') # Second draft with self.assertDB(selects=1, inserts=1, updates=0): with self.assertCache(calls=0): node = cio.set('i18n://sv-se@page/title.up', u'Content-IO - Fast!', publish=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up#draft') assertRevisions(('i18n://sv-se@page/title.txt#1', True), ('i18n://sv-se@page/title.up#draft', False)) self.assertEqual(cio.get('page/title').content, u'Content-IO') # Publish second draft, version 2 with self.assertDB(calls=4, selects=2, updates=2): with self.assertCache(calls=1, sets=1): node = cio.publish(node.uri) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up#2') assertRevisions(('i18n://sv-se@page/title.txt#1', False), ('i18n://sv-se@page/title.up#2', True)) self.assertEqual(cio.get('page/title').content, u'CONTENT-IO - FAST!') # Alter published version 2 with self.assertDB(calls=2, selects=1, inserts=0, updates=1): with self.assertCache(calls=0): node = cio.set('i18n://sv-se@page/title.up#2', u'Content-IO - Lightening fast!', publish=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up#2') assertRevisions(('i18n://sv-se@page/title.txt#1', False), ('i18n://sv-se@page/title.up#2', True)) self.assertEqual(cio.get('page/title').content, u'CONTENT-IO - FAST!') # Not published, still in cache # Re-publish version 2, no change with self.assertDB(selects=1, inserts=0, updates=0): with self.assertCache(calls=1, sets=1): node = cio.publish(node.uri) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up#2') assertRevisions(('i18n://sv-se@page/title.txt#1', False), ('i18n://sv-se@page/title.up#2', True)) self.assertEqual(cio.get('page/title').content, u'CONTENT-IO - LIGHTENING FAST!') # Rollback version 1 with self.assertDB(calls=3, selects=1, updates=2): with self.assertCache(calls=1, sets=1): node = cio.publish('i18n://sv-se@page/title#1') self.assertEqual(node.uri, 'i18n://sv-se@page/title.txt#1') assertRevisions(('i18n://sv-se@page/title.txt#1', True), ('i18n://sv-se@page/title.up#2', False)) self.assertEqual(cio.get('page/title').content, u'Content-IO') # Assert get specific version doesn't mess up the cache cache.clear() with self.assertCache(calls=0): self.assertEqual(cio.get('page/title#2').content, u'CONTENT-IO - LIGHTENING FAST!') with self.assertCache(calls=2, misses=1, sets=1): self.assertEqual(cio.get('page/title').content, u'Content-IO') # Load version 1 and 2 data = cio.load('sv-se@page/title#1') self.assertEqual(data['uri'], 'i18n://sv-se@page/title.txt#1') self.assertEqual(data['data'], u'Content-IO') data = cio.load('sv-se@page/title#2') self.assertEqual(data['uri'], 'i18n://sv-se@page/title.up#2') self.assertEqual(data['data'], {u'name': u'Content-IO - Lightening fast!'}) # Load without version and expect published version data = cio.load('sv-se@page/title') self.assertEqual(data['uri'], 'i18n://sv-se@page/title.txt#1') self.assertEqual(data['data'], u'Content-IO')
def test_revisions(self): def assertRevisions(*revs): revisions = set(cio.revisions('i18n://sv-se@page/title')) assert revisions == set(revs) self.assertEqual(len(set(cio.revisions('i18n://sv-se@page/title'))), 0) node = cio.load('sv-se@page/title') self.assertDictEqual( node, { 'uri': 'i18n://sv-se@page/title.txt', 'data': None, 'content': None, 'meta': {} }) # First draft with self.assertDB(selects=1, inserts=1, updates=0): with self.assertCache(calls=0): node = cio.set('i18n://sv-se@page/title.txt', u'Content-IO', publish=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.txt#draft') assertRevisions(('i18n://sv-se@page/title.txt#draft', False)) self.assertIsNone(cio.get('page/title').content) # Publish first draft, version 1 with self.assertDB(calls=4, selects=2, updates=2): with self.assertCache(calls=1, sets=1): node = cio.publish(node.uri) self.assertEqual(node.uri, 'i18n://sv-se@page/title.txt#1') assertRevisions(('i18n://sv-se@page/title.txt#1', True)) self.assertEqual(cio.get('page/title').content, u'Content-IO') # Second draft with self.assertDB(selects=1, inserts=1, updates=0): with self.assertCache(calls=0): node = cio.set('i18n://sv-se@page/title.up', u'Content-IO - Fast!', publish=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up#draft') assertRevisions(('i18n://sv-se@page/title.txt#1', True), ('i18n://sv-se@page/title.up#draft', False)) self.assertEqual(cio.get('page/title').content, u'Content-IO') # Publish second draft, version 2 with self.assertDB(calls=4, selects=2, updates=2): with self.assertCache(calls=1, sets=1): node = cio.publish(node.uri) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up#2') assertRevisions(('i18n://sv-se@page/title.txt#1', False), ('i18n://sv-se@page/title.up#2', True)) self.assertEqual(cio.get('page/title').content, u'CONTENT-IO - FAST!') # Alter published version 2 with self.assertDB(calls=2, selects=1, inserts=0, updates=1): with self.assertCache(calls=0): node = cio.set('i18n://sv-se@page/title.up#2', u'Content-IO - Lightening fast!', publish=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up#2') assertRevisions(('i18n://sv-se@page/title.txt#1', False), ('i18n://sv-se@page/title.up#2', True)) self.assertEqual( cio.get('page/title').content, u'CONTENT-IO - FAST!') # Not published, still in cache # Re-publish version 2, no change with self.assertDB(selects=1, inserts=0, updates=0): with self.assertCache(calls=1, sets=1): node = cio.publish(node.uri) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up#2') assertRevisions(('i18n://sv-se@page/title.txt#1', False), ('i18n://sv-se@page/title.up#2', True)) self.assertEqual( cio.get('page/title').content, u'CONTENT-IO - LIGHTENING FAST!') # Rollback version 1 with self.assertDB(calls=3, selects=1, updates=2): with self.assertCache(calls=1, sets=1): node = cio.publish('i18n://sv-se@page/title#1') self.assertEqual(node.uri, 'i18n://sv-se@page/title.txt#1') assertRevisions(('i18n://sv-se@page/title.txt#1', True), ('i18n://sv-se@page/title.up#2', False)) self.assertEqual(cio.get('page/title').content, u'Content-IO') # Assert get specific version doesn't mess up the cache cache.clear() with self.assertCache(calls=0): self.assertEqual( cio.get('page/title#2').content, u'CONTENT-IO - LIGHTENING FAST!') with self.assertCache(calls=2, misses=1, sets=1): self.assertEqual(cio.get('page/title').content, u'Content-IO') # Load version 1 and 2 data = cio.load('sv-se@page/title#1') self.assertEqual(data['uri'], 'i18n://sv-se@page/title.txt#1') self.assertEqual(data['data'], u'Content-IO') data = cio.load('sv-se@page/title#2') self.assertEqual(data['uri'], 'i18n://sv-se@page/title.up#2') self.assertEqual(data['data'], {u'name': u'Content-IO - Lightening fast!'}) # Load without version and expect published version data = cio.load('sv-se@page/title') self.assertEqual(data['uri'], 'i18n://sv-se@page/title.txt#1') self.assertEqual(data['data'], u'Content-IO')