def test_uri_redirect(self): cio.set('i18n://sv-se@page/title.txt', u'Title') node = cio.get('i18n://sv-se@page/title', u'Default') self.assertEqual(node.uri, 'i18n://sv-se@page/title.txt#1') self.assertEqual(node.content, u'Title') node = cio.get('i18n://sv-se@page/title.up', u'Default Upper', lazy=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up') self.assertEqual( node.content, u'DEFAULT UPPER' ) # Cache still contains 'Title', but plugin diff and skipped cached_node = cache.get(node.uri) self.assertDictEqual(cached_node, { 'uri': node.uri, 'content': u'DEFAULT UPPER' }) cache.clear() node = cio.get('i18n://sv-se@page/title.up', u'Default-Upper', lazy=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up') self.assertEqual( node.content, u'DEFAULT-UPPER' ) # Cache cleared, storage plugin mismatch, default fallback
def test_node_tag(self): html = self.render(u"{% node 'page/title' edit=False %}") assert html == u'' cio.set('i18n://sv-se@page/title.txt', u'Djedi') cio.set('i18n://sv-se@page/body.txt', u'Lightning fast!') with self.assertCache(calls=1, misses=0): with self.assertDB(calls=0): html = self.render( u"<h1>{% node 'page/title' edit=False %}</h1><p>{% node 'page/body' edit=False %}</p>" ) assert html == u'<h1>Djedi</h1><p>Lightning fast!</p>' cache.clear() with self.assertCache(calls=1, misses=2): with self.assertDB(calls=1): html = self.render( u"<h1>{% node 'page/title' edit=False %}</h1><p>{% node 'page/body' %}</p>" ) assert html == u'<h1>Djedi</h1><p><span data-i18n="sv-se@page/body">Lightning fast!</span></p>' html = self.render(u"{% node 'foo/bar' default='bogus' %}") assert html == u'<span data-i18n="sv-se@foo/bar">bogus</span>' html = self.render(u"{% node 'l10n://foo/bar' default='bogus' %}") self.assertEqual(html, u'<span data-i18n="djedi@foo/bar">bogus</span>')
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 setUp(self): from cio.environment import env from cio.backends import cache from cio.pipeline import pipeline from cio.plugins import plugins env.reset() cache.clear() pipeline.clear() plugins.load()
def test_non_distinct_uri(self): node1 = cio.get('page/title', u'Title1') node2 = cio.get('page/title', u'Title2') self.assertEqual(six.text_type(node1), u'Title1') self.assertEqual(six.text_type(node2), u'Title1') node1 = cio.get('page/title', u'Title1', lazy=False) cache.clear() node2 = cio.get('page/title', u'Title2', lazy=False) self.assertEqual(six.text_type(node1), u'Title1') self.assertEqual(six.text_type(node2), u'Title2') # Second node not buffered, therefore unique default content
def setUp(self): from cio.environment import env from cio.backends import cache, storage from cio.pipeline import pipeline from cio.plugins import plugins env.reset() cache.clear() storage.backend._call_delete() pipeline.clear() plugins.load() self.configure()
def test_non_distinct_uri(self): node1 = cio.get('page/title', u'Title1') node2 = cio.get('page/title', u'Title2') self.assertEqual(six.text_type(node1), u'Title1') self.assertEqual(six.text_type(node2), u'Title1') node1 = cio.get('page/title', u'Title1', lazy=False) cache.clear() node2 = cio.get('page/title', u'Title2', lazy=False) self.assertEqual(six.text_type(node1), u'Title1') self.assertEqual( six.text_type(node2), u'Title2' ) # Second node not buffered, therefore unique default content
def test_uri_redirect(self): cio.set('i18n://sv-se@page/title.txt', u'Title') node = cio.get('i18n://sv-se@page/title', u'Default') self.assertEqual(node.uri, 'i18n://sv-se@page/title.txt#1') self.assertEqual(node.content, u'Title') node = cio.get('i18n://sv-se@page/title.up', u'Default Upper', lazy=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up') self.assertEqual(node.content, u'DEFAULT UPPER') # Cache still contains 'Title', but plugin diff and skipped cached_node = cache.get(node.uri) self.assertDictEqual(cached_node, {'uri': node.uri, 'content': u'DEFAULT UPPER'}) cache.clear() node = cio.get('i18n://sv-se@page/title.up', u'Default-Upper', lazy=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.up') self.assertEqual(node.content, u'DEFAULT-UPPER') # Cache cleared, storage plugin mismatch, default fallback
def test_uri_redirect(self): cio.set('i18n://sv-se@page/title.txt', u'Title') node = cio.get('i18n://sv-se@page/title', u'Default') self.assertEqual(node.uri, 'i18n://sv-se@page/title.txt#1') self.assertEqual(node.content, u'Title') node = cio.get('i18n://sv-se@page/title.md', u'# Default Markdown', lazy=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.md') self.assertEqual(node.content, u'<h1>Default Markdown</h1>') # Cache still contains 'Title', but plugin diff and skipped cached_node = cache.get(node.uri) self.assertDictEqual(cached_node, {'uri': node.uri, 'content': u'<h1>Default Markdown</h1>'}) cache.clear() node = cio.get('i18n://sv-se@page/title.md', u'Default Markdown', lazy=False) self.assertEqual(node.uri, 'i18n://sv-se@page/title.md') self.assertEqual(node.content, u'<p>Default Markdown</p>') # Cache cleared, storage plugin mismatch, default fallback
def test_fallback(self): with cio.env(i18n=('sv-se', 'en-us', 'en-uk')): node1 = cio.set('i18n://bogus@label/email.txt', u'epost') node2 = cio.set('i18n://en-uk@label/surname.txt', u'surname') with self.assertCache(misses=2, sets=2): with self.assertDB(calls=6, selects=6): node3 = cio.get('i18n://label/email') node4 = cio.get('i18n://label/surname', u'efternamn') self.assertIsNone(node3.content) self.assertEqual(node4.content, u'surname') cache.clear() with self.assertCache(misses=2, sets=2): with self.assertDB(calls=6): cio.get('i18n://label/email', lazy=False) cio.get('i18n://label/surname', u'lastname', lazy=False)
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 test_node_tag(self): html = self.render(u"{% node 'page/title' edit=False %}") assert html == u'' cio.set('i18n://sv-se@page/title.txt', u'Djedi') cio.set('i18n://sv-se@page/body.txt', u'Lightning fast!') with self.assertCache(calls=1, misses=0): with self.assertDB(calls=0): html = self.render(u"<h1>{% node 'page/title' edit=False %}</h1><p>{% node 'page/body' edit=False %}</p>") assert html == u'<h1>Djedi</h1><p>Lightning fast!</p>' cache.clear() with self.assertCache(calls=1, misses=2): with self.assertDB(calls=1): html = self.render(u"<h1>{% node 'page/title' edit=False %}</h1><p>{% node 'page/body' %}</p>") assert html == u'<h1>Djedi</h1><p><span data-i18n="sv-se@page/body">Lightning fast!</span></p>' html = self.render(u"{% node 'foo/bar' default='bogus' %}") assert html == u'<span data-i18n="sv-se@foo/bar">bogus</span>' html = self.render(u"{% node 'l10n://foo/bar' default='bogus' %}") self.assertEqual(html, u'<span data-i18n="djedi@foo/bar">bogus</span>')
def test_fallback(self): with cio.env(i18n=('sv-se', 'en-us', 'en-uk')): cio.set('i18n://bogus@label/email.txt', u'epost') cio.set('i18n://en-uk@label/surname.txt', u'surname') with self.assertCache(misses=2, sets=2): with self.assertDB(calls=6, selects=6): node1 = cio.get('i18n://label/email') node2 = cio.get('i18n://label/surname', u'efternamn') self.assertEqual( node1.uri.namespace, 'sv-se' ) # No fallback, stuck on first namespace, sv-se self.assertEqual(node1.namespace_uri.namespace, 'sv-se') self.assertIsNone(node1.content) self.assertEqual(node2.uri.namespace, 'en-uk') self.assertEqual(node2.namespace_uri.namespace, 'sv-se') self.assertEqual(node2.content, u'surname') cache.clear() with self.assertCache(misses=2, sets=2): with self.assertDB(calls=6): cio.get('i18n://label/email', lazy=False) cio.get('i18n://label/surname', u'lastname', lazy=False)
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')