First this brings a change to the paper API: the terminology of bibdata and bibentry is clarified: now bibentry is a dictionary of the form {citekey: bibdata} where bibdata corresponds to the actual dictionary of bibliographic fields and values {author: ..., year: ...}. Now bibentry is an attribute of the paper object that is generated from citekey and bibdata. This commit fixes all tests in particular an issue with citekey in bibentry not updated. Also removes prints in tests and deprecated assertEquals. Usecase tests now fail if the command ask for unexpected inputs. Removes queries for user input in attach and add commands (for deletion of a copied document file). The input was not coherent with tests and is annoying.
104 lines
3.5 KiB
Python
104 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import print_function
|
|
import unittest
|
|
|
|
import yaml
|
|
|
|
import dotdot
|
|
from pubs import endecoder
|
|
from pubs.p3 import ustr
|
|
|
|
from fixtures import dummy_metadata
|
|
from str_fixtures import bibtex_raw0, metadata_raw0, turing_bib
|
|
|
|
|
|
def compare_yaml_str(s1, s2):
|
|
if s1 == s2:
|
|
return True
|
|
else:
|
|
y1 = yaml.safe_load(s1)
|
|
y2 = yaml.safe_load(s2)
|
|
return y1 == y2
|
|
|
|
|
|
class TestEnDecode(unittest.TestCase):
|
|
|
|
def test_encode_bibtex_is_unicode(self):
|
|
decoder = endecoder.EnDecoder()
|
|
entry = decoder.decode_bibdata(bibtex_raw0)
|
|
bibraw = decoder.encode_bibdata(entry)
|
|
self.assertIsInstance(bibraw, ustr)
|
|
|
|
def test_encode_metadat_is_unicode(self):
|
|
decoder = endecoder.EnDecoder()
|
|
data = decoder.encode_metadata(dummy_metadata)
|
|
self.assertIsInstance(data, ustr)
|
|
|
|
def test_endecode_bibtex(self):
|
|
decoder = endecoder.EnDecoder()
|
|
entry = decoder.decode_bibdata(bibtex_raw0)
|
|
|
|
bibraw1 = decoder.encode_bibdata(entry)
|
|
entry1 = decoder.decode_bibdata(bibraw1)
|
|
bibraw2 = decoder.encode_bibdata(entry1)
|
|
entry2 = decoder.decode_bibdata(bibraw2)
|
|
|
|
for citekey in entry1.keys():
|
|
bibentry1 = entry1[citekey]
|
|
bibentry2 = entry2[citekey]
|
|
for key, value in bibentry1.items():
|
|
self.assertEqual(bibentry1[key], bibentry2[key])
|
|
|
|
self.assertEqual(bibraw1, bibraw2)
|
|
|
|
def test_endecode_bibtex_editor(self):
|
|
decoder = endecoder.EnDecoder()
|
|
entry = decoder.decode_bibdata(turing_bib)
|
|
|
|
bibraw1 = decoder.encode_bibdata(entry)
|
|
entry1 = decoder.decode_bibdata(bibraw1)
|
|
bibraw2 = decoder.encode_bibdata(entry1)
|
|
entry2 = decoder.decode_bibdata(bibraw2)
|
|
|
|
for citekey in entry1.keys():
|
|
bibentry1 = entry1[citekey]
|
|
bibentry2 = entry2[citekey]
|
|
for key, value in bibentry1.items():
|
|
self.assertEqual(bibentry1[key], bibentry2[key])
|
|
self.assertEqual(bibraw1, bibraw2)
|
|
|
|
def test_endecode_keyword(self):
|
|
decoder = endecoder.EnDecoder()
|
|
entry = decoder.decode_bibdata(turing_bib)
|
|
keywords = ['artificial intelligence', 'Turing test']
|
|
entry['turing1950computing']['keyword'] = keywords
|
|
bibraw = decoder.encode_bibdata(entry)
|
|
entry1 = decoder.decode_bibdata(bibraw)
|
|
self.assertIn('keyword', entry1['turing1950computing'])
|
|
self.assertEqual(set(keywords),
|
|
set(entry1['turing1950computing']['keyword']))
|
|
|
|
def test_endecode_keyword_as_keywords(self):
|
|
decoder = endecoder.EnDecoder()
|
|
keywords = [u'artificial intelligence', u'Turing test']
|
|
# Add keywords to bibraw
|
|
keyword_str = 'keywords = {artificial intelligence, Turing test},\n'
|
|
biblines = turing_bib.splitlines()
|
|
biblines.insert(-3, keyword_str)
|
|
bibsrc = '\n'.join(biblines)
|
|
entry = decoder.decode_bibdata(bibsrc)['turing1950computing']
|
|
self.assertNotIn(u'keywords', entry)
|
|
self.assertIn(u'keyword', entry)
|
|
self.assertEqual(set(keywords), set(entry[u'keyword']))
|
|
|
|
|
|
def test_endecode_metadata(self):
|
|
decoder = endecoder.EnDecoder()
|
|
entry = decoder.decode_metadata(metadata_raw0)
|
|
metadata_output0 = decoder.encode_metadata(entry)
|
|
self.assertEqual(set(metadata_raw0.split('\n')), set(metadata_output0.split('\n')))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|