def test_plugin(self): self.assertSetEqual(set(plugins.plugins.keys()), set(['txt', 'md'])) settings.configure(PLUGINS=[ 'cio.plugins.txt.TextPlugin', 'cio.plugins.md.MarkdownPlugin', 'tests.UppercasePlugin' ]) self.assertSetEqual(set(plugins.plugins.keys()), set(['txt', 'md', 'up'])) node = cio.set('sv-se@page/title.up', {'name': u'lundberg'}, publish=False) self.assertListEqual(node._content, [{'name': u'lundberg'}, u'{"name": "lundberg"}', u'LUNDBERG']) cio.publish(node.uri) node = cio.get('page/title') raw_content = storage.get(node.uri) self.assertIsNotNone(raw_content) self.assertEqual(raw_content['uri'], 'i18n://sv-se@page/title.up#1') self.assertEqual(raw_content['content'], u'{"name": "lundberg"}') self.assertEqual(node.content, u'LUNDBERG') self.assertEqual(node.uri.ext, 'up') self.assertSetEqual(set(p for p in plugins), set(('txt', 'md', 'up')))
def test_set(self): response = self.post('api', 'i18n://page/title', {'data': u'# Djedi'}) self.assertEqual(response.status_code, 400) response = self.post('api', 'i18n://sv-se@page/title.txt', {'data': u'# Djedi', 'data[extra]': u'foobar'}) self.assertEqual(response.status_code, 400) uri = 'i18n://sv-se@page/title.md' response = self.post('api', uri, {'data': u'# Djedi', 'meta[message]': u'lundberg'}) 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#draft', 'content': u'<h1>Djedi</h1>'}) self.assertEqual(meta['author'], u'master') self.assertEqual(meta['message'], u'lundberg') node = cio.get(uri, lazy=False) self.assertIsNone(node.content) cio.publish(uri) node = cio.get(uri, lazy=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.md#1') self.assertEqual(node.content, u'<h1>Djedi</h1>') response = self.post('api', node.uri, {'data': u'# Djedi', 'meta[message]': u'Lundberg'}) node = json_node(response, simple=False) self.assertEqual(node['meta']['message'], u'Lundberg') with self.assertRaises(PersistenceError): storage.backend._create(URI(node['uri']), None)
def test_plugin(self): self.assertSetEqual(set(plugins.plugins.keys()), set(['txt', 'md'])) settings.configure(PLUGINS=[ 'cio.plugins.txt.TextPlugin', 'cio.plugins.md.MarkdownPlugin', 'tests.UppercasePlugin' ]) self.assertSetEqual(set(plugins.plugins.keys()), set(['txt', 'md', 'up'])) node = cio.set('sv-se@page/title.up', {'name': u'lundberg'}, publish=False) self.assertListEqual(node._content, [{ 'name': u'lundberg' }, u'{"name": "lundberg"}', u'LUNDBERG']) cio.publish(node.uri) node = cio.get('page/title') raw_content = storage.get(node.uri) self.assertIsNotNone(raw_content) self.assertEqual(raw_content['uri'], 'i18n://sv-se@page/title.up#1') self.assertEqual(raw_content['content'], u'{"name": "lundberg"}') self.assertEqual(node.content, u'LUNDBERG') self.assertEqual(node.uri.ext, 'up') self.assertSetEqual(set(p for p in plugins), set(('txt', 'md', 'up')))
def test_set(self): with self.assertRaises(URI.Invalid): cio.set('page/title', 'fail') with self.assertRaises(URI.Invalid): cio.set('page/title.txt', 'fail') node = cio.set('i18n://sv-se@label/email.md', u'e-post') self.assertEqual(node.uri, 'i18n://sv-se@label/email.md#1') cache.clear() node = cio.get('label/email', u'fallback') self.assertEqual(node.content, u'<p>e-post</p>') self.assertEqual(node.uri, 'i18n://sv-se@label/email.md#1') self.assertEqual(node.initial, u'fallback') self.assertEqual(len(node.meta.keys()), 0) # No meta returned from non-versioned api get self.assertEqual(repr(node._node), '<Node: i18n://sv-se@label/email.md#1>') self.assertEqual(node.for_json(), { 'uri': node.uri, 'content': node.content, 'meta': node.meta }) node = cio.set('sv-se@label/email', u'e-post', publish=False) self.assertEqual(node.uri, 'i18n://sv-se@label/email.txt#draft') self.assertKeys(node.meta, 'modified_at', 'is_published') node = cio.publish(node.uri) self.assertKeys(node.meta, 'modified_at', 'published_at', 'is_published') self.assertTrue(node.meta['is_published']) node = cio.get('label/email') self.assertEqual(node.uri, 'i18n://sv-se@label/email.txt#2') self.assertEqual(node.content, u'e-post') self.assertEqual(node.uri.ext, 'txt') self.assertEqual(len(node.meta.keys()), 0)
def test_set(self): with self.assertRaises(URI.Invalid): cio.set('page/title', 'fail') with self.assertRaises(URI.Invalid): cio.set('page/title.txt', 'fail') node = cio.set('i18n://sv-se@label/email.up', u'e-post') self.assertEqual(node.uri, 'i18n://sv-se@label/email.up#1') cache.clear() node = cio.get('label/email', u'fallback') self.assertEqual(node.content, u'E-POST') self.assertEqual(node.uri, 'i18n://sv-se@label/email.up#1') self.assertEqual(node.initial, u'fallback') self.assertEqual(len(node.meta.keys()), 0) # No meta returned from non-versioned api get self.assertEqual(repr(node._node), '<Node: i18n://sv-se@label/email.up#1>') self.assertEqual(node.for_json(), { 'uri': node.uri, 'content': node.content, 'meta': node.meta }) node = cio.set('sv-se@label/email', u'e-post', publish=False) self.assertEqual(node.uri, 'i18n://sv-se@label/email.txt#draft') self.assertKeys(node.meta, 'modified_at', 'is_published') node = cio.publish(node.uri) self.assertKeys(node.meta, 'modified_at', 'published_at', 'is_published') self.assertTrue(node.meta['is_published']) node = cio.get('label/email') self.assertEqual(node.uri, 'i18n://sv-se@label/email.txt#2') self.assertEqual(node.content, u'e-post') self.assertEqual(node.uri.ext, 'txt') self.assertEqual(len(node.meta.keys()), 0) # Try publish non-existing node/uri node = cio.publish('i18n://sv-se@foo/bar.txt#draft') self.assertIsNone(node)
def put(self, request, uri): """ Publish versioned uri. JSON Response: {uri: x, content: y} """ uri = self.decode_uri(uri) node = cio.publish(uri) if not node: raise Http404 return self.render_to_json(node)
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')