You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1116 lines
41 KiB

# -*- coding: utf-8 -*-
from __future__ import print_function, unicode_literals
import unittest
import os
import re
import sys
import shutil
import six
import ddt
import certifi
import mock
from pyfakefs.fake_filesystem import FakeFileOpen
import dotdot
import fake_env
import mock_requests
from pubs import pubs_cmd, color, content, uis, p3, endecoder
from pubs.config import conf
import str_fixtures
import fixtures
11 years ago
# makes the tests very noisy
PRINT_OUTPUT = False
CAPTURE_OUTPUT = True
11 years ago
class FakeSystemExit(Exception):
"""\
SystemExit exceptions are replaced by FakeSystemExit in the execute_cmds()
function, so they can be catched by ExpectedFailure tests in Python 2.x.
If a code is expected to raise SystemExit, catch FakeSystemExit instead.
Added explicit __init__ so SystemExit.code functionality could be emulated.
Taking form from https://stackoverflow.com/a/26938914/1634191
"""
def __init__(self, code=None, *args):
self.code = code
super(FakeSystemExit, self).__init__(
"Exited with code: {}.".format(self.code), *args)
class TestInput(unittest.TestCase):
"""Test that the fake input mechanisms work correctly in the tests"""
def test_input(self):
input = fake_env.FakeInput(['yes', 'no'])
self.assertEqual(input(), 'yes')
self.assertEqual(input(), 'no')
with self.assertRaises(fake_env.FakeInput.UnexpectedInput):
input()
def test_input2(self):
other_input = fake_env.FakeInput(['yes', 'no'], module_list=[color])
other_input.as_global()
self.assertEqual(color.input(), 'yes')
self.assertEqual(color.input(), 'no')
with self.assertRaises(fake_env.FakeInput.UnexpectedInput):
color.input()
def test_editor_input(self):
sample_conf = conf.load_default_conf()
ui = uis.InputUI(sample_conf)
other_input = fake_env.FakeInput(['yes', 'no'],
module_list=[uis])
other_input.as_global()
self.assertEqual(ui.editor_input('fake_editor'), 'yes')
self.assertEqual(ui.editor_input('fake_editor'), 'no')
with self.assertRaises(fake_env.FakeInput.UnexpectedInput):
ui.editor_input()
class CommandTestCase(fake_env.TestFakeFs):
"""Abstract TestCase intializing the fake filesystem."""
maxDiff = 1000000
def setUp(self, nsec_stat=True):
super(CommandTestCase, self).setUp()
os.stat_float_times(nsec_stat)
self.default_pubs_dir = os.path.expanduser('~/.pubs')
self.default_conf_path = os.path.expanduser('~/.pubsrc')
def execute_cmds(self, cmds, capture_output=CAPTURE_OUTPUT):
""" Execute a list of commands, and capture their output
A command can be a string, or a tuple of size 2, 3 or 4.
In the latter case, the command is :
1. a string reprensenting the command to execute
2. the user inputs to feed to the command during execution
3. the expected output on stdout, verified with assertEqual.
4. the expected output on stderr, verified with assertEqual.
"""
6 years ago
def normalize(s):
s = color.undye(s)
try:
s = s.decode('utf-8')
except AttributeError:
pass
return s
try:
outs = []
for cmd in cmds:
inputs = []
expected_out, expected_err = None, None
actual_cmd = cmd
if not isinstance(cmd, p3.ustr):
actual_cmd = cmd[0]
if len(cmd) >= 2 and cmd[1] is not None: # Inputs provided
inputs = cmd[1]
if len(cmd) >= 3: # Expected output provided
capture_output = True
if cmd[2] is not None:
expected_out = color.undye(cmd[2])
if len(cmd) >= 4 and cmd[3] is not None: # Expected error output provided
expected_err = color.undye(cmd[3])
# Always set fake input: test should not ask unexpected user input
input = fake_env.FakeInput(inputs, [content, uis, p3])
input.as_global()
try:
if capture_output:
capture_wrap = fake_env.capture(pubs_cmd.execute,
verbose=PRINT_OUTPUT)
_, stdout, stderr = capture_wrap(actual_cmd.split())
6 years ago
actual_out = normalize(stdout)
actual_err = normalize(stderr)
if expected_out is not None:
self.assertEqual(p3.u_maybe(actual_out), p3.u_maybe(expected_out))
if expected_err is not None:
self.assertEqual(p3.u_maybe(actual_err), p3.u_maybe(expected_err))
outs.append(color.undye(actual_out))
else:
pubs_cmd.execute(actual_cmd.split())
except fake_env.FakeInput.UnexpectedInput:
self.fail('Unexpected input asked by command: {}.'.format(
actual_cmd))
return outs
except SystemExit as exc:
exc_class, exc, tb = sys.exc_info()
if sys.version_info.major == 2:
# using six to avoid a SyntaxError in Python 3.x
six.reraise(FakeSystemExit, FakeSystemExit(*exc.args), tb)
else:
raise FakeSystemExit(*exc.args).with_traceback(tb)
def tearDown(self):
pass
class DataCommandTestCase(CommandTestCase):
"""Abstract TestCase intializing the fake filesystem and
copying fake data.
"""
def setUp(self, nsec_stat=True):
super(DataCommandTestCase, self).setUp(nsec_stat=nsec_stat)
self.fs.add_real_directory(os.path.join(self.rootpath, 'data'), read_only=False)
self.fs.add_real_directory(os.path.join(self.rootpath, 'bibexamples'), read_only=False)
# add certificate for web querries
self.fs.add_real_file(certifi.where(), read_only=True)
self.fs.add_real_file(mock_requests._data_filepath, read_only=False)
def assertFileContentEqual(self, path, expected_content):
self.assertTrue(os.path.isfile(path))
self.assertEqual(content.get_content(path), expected_content)
class URLContentTestCase(DataCommandTestCase):
"""Mocks access to online files by using files in data directory.
"""
def setUp(self):
super(URLContentTestCase, self).setUp()
self._original_get_byte_url_content = content._get_byte_url_content
self._original_url_exist = content.url_exists
content._get_byte_url_content = self.url_to_byte_content
content.url_exists = self.url_exists
def _url_to_path(self, url):
return p3.urlparse(url).path
def url_exists(self, url):
return self.fs.exists(self._url_to_path(url))
def url_to_byte_content(self, url, ui=None):
path = self._url_to_path(url)
with FakeFileOpen(self.fs)('data' + path, 'rb') as f:
return f.read()
def tearDown(self):
super(URLContentTestCase, self).tearDown()
content._get_byte_url_content = self._original_get_byte_url_content
content.url_exists = self._original_url_exist
# Actual tests
class TestAlone(CommandTestCase):
def test_alone_misses_command(self):
with self.assertRaises(FakeSystemExit) as cm:
self.execute_cmds(['pubs'])
self.assertEqual(cm.exception.code, 2)
def test_alone_prints_help(self):
# capturing the output of `pubs --help` is difficult because argparse
# raises as SystemExit(0) after calling `print_help`, and this gets
# caught so no output is captured. so comparing outputs of `pubs` and
# `pubs --help` isn't too easy unless substantially reorganization of
# the parser and testing context is made. instead, the exit codes of
# the two usecases are compared.
with self.assertRaises(FakeSystemExit) as cm1:
self.execute_cmds(['pubs'])
self.assertEqual(cm1.exception.code, 2)
def test_help_prints_help(self):
# see test_alone_prints_help
with self.assertRaises(FakeSystemExit) as cm2:
self.execute_cmds(['pubs init', 'pubs --help'])
self.assertEqual(cm2.exception.code, 0)
class TestInit(CommandTestCase):
def test_init(self):
pubsdir = os.path.expanduser('~/pubs_test2')
self.execute_cmds(['pubs init -p {}'.format(pubsdir)])
self.assertEqual(set(os.listdir(pubsdir)),
{'bib', 'doc', 'meta', 'notes', '.cache'})
def test_init2(self):
pubsdir = os.path.expanduser('~/.pubs')
self.execute_cmds(['pubs init'])
self.assertEqual(set(os.listdir(pubsdir)),
{'bib', 'doc', 'meta', 'notes', '.cache'})
def test_init_config(self):
self.execute_cmds(['pubs init'])
self.assertTrue(os.path.isfile(self.default_conf_path))
class TestAdd(URLContentTestCase):
def test_add(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib -d data/pagerank.pdf',
]
self.execute_cmds(cmds)
bib_dir = os.path.join(self.default_pubs_dir, 'bib')
meta_dir = os.path.join(self.default_pubs_dir, 'meta')
doc_dir = os.path.join(self.default_pubs_dir, 'doc')
self.assertEqual(set(os.listdir(bib_dir)), {'Page99.bib'})
self.assertEqual(set(os.listdir(meta_dir)), {'Page99.yaml'})
self.assertEqual(set(os.listdir(doc_dir)), {'Page99.pdf'})
def test_add_bibutils(self):
cmds = ['pubs init',
'pubs add bibexamples/bibutils.bib',
]
self.execute_cmds(cmds)
bib_dir = os.path.join(self.default_pubs_dir, 'bib')
self.assertEqual(set(os.listdir(bib_dir)), {'Page99.bib'})
def test_add_other_repository_path(self):
cmds = ['pubs init -p /not_default',
'pubs add data/pagerank.bib -d data/pagerank.pdf',
]
self.execute_cmds(cmds)
self.assertEqual(set(os.listdir('/not_default/doc')), {'Page99.pdf'})
def test_add_citekey(self):
cmds = ['pubs init',
'pubs add -k CustomCitekey data/pagerank.bib',
]
self.execute_cmds(cmds)
bib_dir = os.path.join(self.default_pubs_dir, 'bib')
self.assertEqual(set(os.listdir(bib_dir)), {'CustomCitekey.bib'})
def test_add_utf8_citekey(self):
correct = ["",
("added to pubs:\n"
"[hausdorff1949grundzüge] Hausdorff, Felix \"Grundzüge der Mengenlehre\" (1949) \n"),
"The 'hausdorff1949grundzüge' citekey has been renamed into 'アスキー'\n",
"The 'アスキー' citekey has been renamed into 'Ḽơᶉëᶆ_ȋṕšᶙṁ'\n"
]
cmds = ['pubs init',
('pubs add bibexamples/utf8.bib', [], correct[1]),
('pubs rename hausdorff1949grundzüge アスキー', [], correct[2]),
('pubs rename アスキー Ḽơᶉëᶆ_ȋṕšᶙṁ', [], correct[3]),
]
self.execute_cmds(cmds)
def test_add_doc_nocopy_does_not_copy(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib --link -d data/pagerank.pdf',
]
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
[])
self.assertTrue(os.path.exists('data/pagerank.pdf'))
def test_add_doc_nocopy_from_config_does_not_copy(self):
self.execute_cmds(['pubs init'])
config = conf.load_conf()
config['main']['doc_add'] = 'link'
conf.save_conf(config)
cmds = ['pubs add data/pagerank.bib -d data/pagerank.pdf']
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
[])
self.assertTrue(os.path.exists('data/pagerank.pdf'))
def test_add_doc_copy(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib --copy -d data/pagerank.pdf',
]
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
['Page99.pdf'])
self.assertTrue(os.path.exists('data/pagerank.pdf'))
def test_add_doc_copy_from_config(self):
self.execute_cmds(['pubs init'])
config = conf.load_conf()
config['main']['doc_add'] = 'copy'
conf.save_conf(config)
cmds = ['pubs add data/pagerank.bib -d data/pagerank.pdf']
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
['Page99.pdf'])
self.assertTrue(os.path.exists('data/pagerank.pdf'))
def test_add_doc_move(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib --move -d data/pagerank.pdf',
]
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
['Page99.pdf'])
self.assertFalse(os.path.exists('data/pagerank.pdf'))
def test_add_doc_move_from_config(self):
self.execute_cmds(['pubs init'])
config = conf.load_conf()
config['main']['doc_add'] = 'move'
conf.save_conf(config)
cmds = ['pubs add data/pagerank.bib -d data/pagerank.pdf']
self.execute_cmds(cmds)
self.assertEqual(
os.listdir(os.path.join(self.default_pubs_dir, 'doc')),
['Page99.pdf'])
self.assertFalse(os.path.exists('data/pagerank.pdf'))
def test_add_move_removes_doc(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib --move -d data/pagerank.pdf',
]
self.execute_cmds(cmds)
self.assertFalse(os.path.exists('data/pagerank.pdf'))
def test_add_twice_fails(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib',
'pubs add -k Page99 data/turing1950.bib',
]
with self.assertRaises(FakeSystemExit):
self.execute_cmds(cmds)
def test_add_urls(self):
cmds = ['pubs init',
'pubs add http://host.xxx/pagerank.bib '
'-d http://host.xxx/pagerank.pdf',
]
self.execute_cmds(cmds)
bib_dir = os.path.join(self.default_pubs_dir, 'bib')
self.assertEqual(set(os.listdir(bib_dir)), {'Page99.bib'})
meta_dir = os.path.join(self.default_pubs_dir, 'meta')
self.assertEqual(set(os.listdir(meta_dir)), {'Page99.yaml'})
doc_dir = os.path.join(self.default_pubs_dir, 'doc')
self.assertEqual(set(os.listdir(doc_dir)), {'Page99.pdf'})
def test_leading_citekey_space(self):
cmds = ['pubs init',
'pubs add bibexamples/leadingspace.bib',
'pubs rename LeadingSpace NoLeadingSpace',
]
self.execute_cmds(cmds)
def test_add_no_citekey_fails(self):
# See #113
cmds = ['pubs init',
('pubs add', [str_fixtures.bibtex_no_citekey, 'n']),
]
with self.assertRaises(FakeSystemExit):
self.execute_cmds(cmds)
def test_add_edit_fails(self):
cmds = ['pubs init',
('pubs add',
['@misc{I am not a correct bibtex{{}', 'n']),
]
with self.assertRaises(FakeSystemExit) as cm:
self.execute_cmds(cmds)
self.assertEqual(cm.exception.code, 1)
class TestList(DataCommandTestCase):
12 years ago
def test_list(self):
cmds = ['pubs init -p /not_default2',
'pubs list',
'pubs add data/pagerank.bib -d data/pagerank.pdf',
'pubs list',
]
outs = self.execute_cmds(cmds)
self.assertEqual(0, len(outs[1].splitlines()))
self.assertEqual(1, len(outs[3].splitlines()))
def test_list_several_no_date(self):
self.execute_cmds(['pubs init -p testrepo'])
os.chdir('/') # weird fix for shutil.rmtree invocation.
shutil.rmtree(os.path.join(self.rootpath, 'testrepo'))
os.chdir(self.rootpath)
self.fs.add_real_directory(os.path.join(self.rootpath, 'testrepo'), read_only=False)
#fake_env.copy_dir(self.fs, testrepo, 'testrepo')
cmds = ['pubs list',
'pubs remove -f Page99',
'pubs list',
'pubs add data/pagerank.bib -d data/pagerank.pdf',
'pubs list',
]
outs = self.execute_cmds(cmds)
self.assertEqual(4, len(outs[0].splitlines()))
self.assertEqual(3, len(outs[2].splitlines()))
self.assertEqual(4, len(outs[4].splitlines()))
# Last added should be last
self.assertEqual('[Page99]', outs[4].splitlines()[-1][:8])
def test_list_smart_case(self):
cmds = ['pubs init',
'pubs list',
'pubs import data/',
'pubs list title:language author:Saunders',
]
outs = self.execute_cmds(cmds)
self.assertEqual(1, len(outs[-1].splitlines()))
def test_list_ignore_case(self):
cmds = ['pubs init',
'pubs list',
'pubs import data/',
'pubs list --ignore-case title:lAnguAge author:saunders',
]
outs = self.execute_cmds(cmds)
self.assertEqual(1, len(outs[-1].splitlines()))
def test_list_force_case(self):
cmds = ['pubs init',
'pubs list',
'pubs import data/',
'pubs list --force-case title:Language author:saunders',
]
outs = self.execute_cmds(cmds)
self.assertEqual(0 + 1, len(outs[-1].split('\n')))
def test_list_strict_forces_case(self):
cmds = ['pubs init',
'pubs list',
'pubs import data/',
'pubs list --ignore-case --strict title:lAnguage',
]
outs = self.execute_cmds(cmds)
self.assertEqual(0 + 1, len(outs[-1].split('\n')))
def test_list_strict(self):
cmds = ['pubs init',
'pubs list',
'pubs import data/',
'pubs list --strict title:{L}anguage',
]
outs = self.execute_cmds(cmds)
self.assertEqual(0 + 1, len(outs[-1].split('\n')))
def test_list_latex_protection(self):
cmds = ['pubs init',
'pubs list',
'pubs import data/',
'pubs list title:{L}anguage',
]
outs = self.execute_cmds(cmds)
self.assertEqual(1 + 1, len(outs[-1].split('\n')))
def test_list_with_citekey_query(self):
cmds = ['pubs init',
'pubs import data/',
'pubs list citekey:Page99',
'pubs list key:eiNstein_1935',
'pubs list --ignore-case key:eiNstein_1935',
]
outs = self.execute_cmds(cmds)
self.assertEqual(1, len(outs[2].splitlines()))
self.assertEqual(0, len(outs[3].splitlines()))
self.assertEqual(1, len(outs[4].splitlines()))
class TestTag(DataCommandTestCase):
def setUp(self):
super(TestTag, self).setUp()
init = ['pubs init',
'pubs add data/pagerank.bib',
'pubs add -k Turing1950 data/turing1950.bib',
]
self.execute_cmds(init)
def test_add_tag(self):
cmds = ['pubs tag Page99 search',
'pubs tag Turing1950 ai',
'pubs list',
]
correct = ['',
'',
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) | search\n' +
'[Turing1950] Turing, Alan M "Computing machinery and intelligence" Mind (1950) | ai\n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
def test_add_tags(self):
"""Adds several tags at once.
Also checks that tags printed in alphabetic order.
"""
cmds = ['pubs tag Page99 search+network',
'pubs list',
]
correct = ['',
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) | network,search\n' +
'[Turing1950] Turing, Alan M "Computing machinery and intelligence" Mind (1950) \n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
def test_remove_tag(self):
cmds = ['pubs tag Page99 search+network',
'pubs tag Page99 :network',
'pubs list',
]
correct = ['',
'',
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) | search\n' +
'[Turing1950] Turing, Alan M "Computing machinery and intelligence" Mind (1950) \n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
def test_add_remove_tag(self):
cmds = ['pubs tag Page99 a',
'pubs tag Page99 b-a',
'pubs list',
]
correct = ['',
'',
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) | b\n' +
'[Turing1950] Turing, Alan M "Computing machinery and intelligence" Mind (1950) \n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
def test_wrong_citekey(self):
cmds = ['pubs tag Page999 a',
]
with self.assertRaises(FakeSystemExit):
self.execute_cmds(cmds)
class TestURL(DataCommandTestCase):
def setUp(self):
super(TestURL, self).setUp()
init = ['pubs init',
'pubs add data/pagerank.bib',
'pubs add data/turing1950.bib',
'pubs add data/martius.bib',
]
self.execute_cmds(init)
@mock.patch('webbrowser.open')
def test_url_open_one(self, wb_open):
7 years ago
cmds = ['pubs url Page99',
]
correct = ['info: opening url http://ilpubs.stanford.edu:8090/422/\n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
@mock.patch('webbrowser.open')
def test_url_open_missing(self, wb_open):
cmds = [('pubs url turing1950computing', None, None, 'warning: turing1950computing has no url\n'),
]
self.execute_cmds(cmds)
@mock.patch('webbrowser.open')
def test_url_open_multiple(self, wb_open):
7 years ago
cmds = ['pubs url Page99 10.1371_journal.pone.0063400',
]
correct = ['info: opening url http://ilpubs.stanford.edu:8090/422/\n' +
'info: opening url http://dx.doi.org/10.1371%2Fjournal.pone.0063400\n',
]
out = self.execute_cmds(cmds)
self.assertEqual(out, correct)
class TestNote(DataCommandTestCase):
def setUp(self):
super(TestNote, self).setUp()
init = ['pubs init',
'pubs add data/pagerank.bib',
]
self.execute_cmds(init)
self.note_dir = os.path.join(self.default_pubs_dir, 'notes')
def test_note_edit(self):
cmds = [('pubs note Page99', ['xxx']),
]
self.execute_cmds(cmds)
self.assertFileContentEqual(os.path.join(self.note_dir, 'Page99.txt'),
'xxx')
def test_note_edit_extension(self):
config = conf.load_conf()
config['main']['note_extension'] = 'md'
conf.save_conf(config)
cmds = [('pubs note Page99', ['xxx']),
]
self.execute_cmds(cmds)
self.assertEqual(set(os.listdir(self.note_dir)), {'Page99.md'})
self.assertFileContentEqual(os.path.join(self.note_dir, 'Page99.md'),
'xxx')
def test_rename_with_note(self):
config = conf.load_conf()
conf.save_conf(config)
cmds = [('pubs note Page99', ['xxx']),
'pubs rename Page99 Page1999',
]
self.execute_cmds(cmds)
self.assertEqual(set(os.listdir(self.note_dir)), {'Page1999.txt'})
self.assertFileContentEqual(os.path.join(self.note_dir, 'Page1999.txt'),
'xxx')
def test_rename_with_note_extension(self):
config = conf.load_conf()
config['main']['note_extension'] = 'md'
conf.save_conf(config)
cmds = [('pubs note Page99', ['xxx']),
'pubs rename Page99 Page1999',
]
self.execute_cmds(cmds)
self.assertEqual(set(os.listdir(self.note_dir)), {'Page1999.md'})
self.assertFileContentEqual(os.path.join(self.note_dir, 'Page1999.md'),
'xxx')
def test_remove_with_note_extension(self):
config = conf.load_conf()
config['main']['note_extension'] = 'md'
conf.save_conf(config)
cmds = [('pubs note Page99', ['xxx']),
('pubs remove Page99', ['y']),
]
self.execute_cmds(cmds)
self.assertEqual(os.listdir(self.note_dir), [])
class TestUsecase(DataCommandTestCase):
def test_first(self):
correct = ['Initializing pubs in /paper_first\n',
'added to pubs:\n[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) \n'
'data/pagerank.pdf was copied to the pubs repository.\n',
7 years ago
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) [pdf] \n',
'\n',
'',
'network search\n',
'info: Assuming search to be a tag.\n'
7 years ago
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) [pdf] | network,search\n',
]
cmds = ['pubs init -p /paper_first',
'pubs add -d data/pagerank.pdf data/pagerank.bib',
'pubs list',
'pubs tag',
'pubs tag Page99 network+search',
'pubs tag Page99',
'pubs tag search',
]
self.assertEqual(correct, self.execute_cmds(cmds, capture_output=True))
def test_second(self):
cmds = ['pubs init -p paper_second/',
'pubs add data/pagerank.bib',
'pubs add -d data/turing-mind-1950.pdf data/turing1950.bib',
'pubs add data/martius.bib',
'pubs add data/10.1371%2Fjournal.pone.0038236.bib',
'pubs list',
'pubs doc add data/pagerank.pdf Page99'
]
self.execute_cmds(cmds)
def test_third(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib',
'pubs add -d data/turing-mind-1950.pdf data/turing1950.bib',
'pubs add data/martius.bib',
'pubs add data/10.1371%2Fjournal.pone.0038236.bib',
'pubs list',
'pubs doc add data/pagerank.pdf Page99',
('pubs remove Page99', ['y']),
'pubs remove -f turing1950computing',
]
self.execute_cmds(cmds)
docdir = os.path.expanduser('~/.pubs/doc/')
self.assertNotIn('turing-mind-1950.pdf', os.listdir(docdir))
def test_tag_list(self):
correct = ['Initializing pubs in /paper_first\n',
'',
'',
'',
'search network\n',
]
cmds = ['pubs init -p paper_first/',
'pubs add -d data/pagerank.pdf data/pagerank.bib',
'pubs tag',
'pubs tag Page99 network+search',
'pubs tag',
]
out = self.execute_cmds(cmds)
def clean(s):
return set(s.strip().split(' '))
self.assertEqual(clean(correct[2]), clean(out[2]))
self.assertEqual(clean(correct[4]), clean(out[4]))
def test_conf(self):
cmds = ['pubs init',
('pubs conf', [str_fixtures.sample_conf]),
]
self.execute_cmds(cmds)
self.assertFileContentEqual(os.path.expanduser('~/.pubsrc'),
str_fixtures.sample_conf)
def test_editor_aborts(self):
with self.assertRaises(FakeSystemExit):
cmds = ['pubs init',
'pubs add data/pagerank.bib',
('pubs edit Page99', ['', 'n']),
12 years ago
]
self.execute_cmds(cmds)
12 years ago
def test_editor_succeeds_on_second_edit(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib',
('pubs edit Page99', [
'@misc{Page99, title="TTT" author="X. YY"}', 'y',
'@misc{Page99, title="TTT", author="X. YY"}', '']),
('pubs list', [], '[Page99] YY, X. "TTT" \n')
]
self.execute_cmds(cmds)
def test_add_aborts(self):
with self.assertRaises(FakeSystemExit):
cmds = ['pubs init',
('pubs add New', ['']),
]
self.execute_cmds(cmds)
def test_add_succeeds_on_second_edit(self):
cmds = ['pubs init',
('pubs add', [
'', 'y',
'@misc{New, title="TTT", author="X. YY"}', '']),
('pubs list', [], '[New] YY, X. "TTT" \n')
]
self.execute_cmds(cmds)
def test_editor_success(self):
cmds = ['pubs init',
('pubs add', [str_fixtures.bibtex_external0]),
('pubs remove Page99', ['y']),
]
self.execute_cmds(cmds)
def test_edit(self):
bib = str_fixtures.bibtex_external0
bib1 = re.sub('year = \{1999\}', 'year = {2007}', bib)
bib2 = re.sub('Lawrence Page', 'Lawrence Ridge', bib1)
bib3 = re.sub('Page99', 'Ridge07', bib2)
line = '[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) \n'
line1 = re.sub('1999', '2007', line)
line2 = re.sub('Page,', 'Ridge,', line1)
line3 = re.sub('Page99', 'Ridge07', line2)
cmds = ['pubs init',
'pubs add data/pagerank.bib',
('pubs list', [], line),
('pubs edit Page99', [bib1]),
('pubs list', [], line1),
('pubs edit Page99', [bib2]),
('pubs list', [], line2),
('pubs edit Page99', [bib3]),
('pubs list', [], line3),
]
self.execute_cmds(cmds)
def test_edit_meta(self):
meta = str_fixtures.turing_meta
line = '[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) \n'
line1 = re.sub('\n', '| AI,computer\n', line)
cmds = ['pubs init',
'pubs add data/pagerank.bib',
('pubs list', [], line),
('pubs edit -m Page99', [meta]),
('pubs list', [], line1),
]
self.execute_cmds(cmds)
def test_export(self):
cmds = ['pubs init',
('pubs add', [str_fixtures.bibtex_external0]),
'pubs export Page99',
]
outs = self.execute_cmds(cmds)
self.assertEqual(endecoder.EnDecoder().decode_bibdata(outs[2]),
fixtures.page_bibentry)
def test_export_ignore_field(self):
cmds = ['pubs init',
('pubs add', [str_fixtures.bibtex_external0]),
'pubs export --ignore-fields author,title Page99',
]
outs = self.execute_cmds(cmds)
expected = endecoder.EnDecoder().encode_bibdata(
fixtures.page_bibentry, ignore_fields=['author', 'title'])
self.assertEqual(outs[2], expected + os.linesep)
def test_import(self):
cmds = ['pubs init',
'pubs import data/',
'pubs list'
]
outs = self.execute_cmds(cmds)
self.assertEqual(9, len(outs[-1].split('\n')))
def test_import_one(self):
cmds = ['pubs init',
'pubs import data/ Page99',
'pubs list'
]
outs = self.execute_cmds(cmds)
self.assertEqual(1 + 1, len(outs[-1].split('\n')))
def test_import_does_not_overwrite(self):
cmds = ['pubs init',
'pubs import data/ Page99',
'pubs import data/',
'pubs list'
]
with self.assertRaises(FakeSystemExit):
self.execute_cmds(cmds)
def test_import_overwrites(self):
cmds = ['pubs init',
'pubs import data/ Page99',
'pubs import --overwrite data/ Page99',
'pubs list'
]
outs = self.execute_cmds(cmds)
self.assertEqual(1 + 1, len(outs[-1].split('\n')))
def test_import_fails_without_ignore(self):
with FakeFileOpen(self.fs)('data/fake.bib', 'w') as f:
f.write(str_fixtures.not_bibtex)
cmds = ['pubs init',
'pubs import data/ Page99',
]
with self.assertRaises(FakeSystemExit):
self.execute_cmds(cmds)
def test_import_ignores(self):
with FakeFileOpen(self.fs)('data/fake.bib', 'w') as f:
f.write(str_fixtures.not_bibtex)
cmds = ['pubs init',
'pubs import --ignore-malformed data/ Page99',
'pubs list'
]
outs = self.execute_cmds(cmds)
self.assertEqual(1 + 1, len(outs[-1].split('\n')))
def test_update(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib',
'pubs update'
]
with self.assertRaises(FakeSystemExit):
self.execute_cmds(cmds)
def test_add_with_tag(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib --tags junk',
'pubs tag junk'
]
outs = self.execute_cmds(cmds)
self.assertEqual(2, len(outs[2].splitlines()))
def test_doc_open(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib',
'pubs doc open Page99'
]
with self.assertRaises(FakeSystemExit):
self.execute_cmds(cmds)
with self.assertRaises(FakeSystemExit):
cmds[-1] == 'pubs doc open Page8'
self.execute_cmds(cmds)
def test_doc_add(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib',
'pubs doc add data/pagerank.pdf Page99'
]
self.execute_cmds(cmds)
self.assertTrue(os.path.exists(
os.path.join(self.default_pubs_dir,
'doc',
'Page99.pdf')))
# Also test that do not remove original
self.assertTrue(os.path.exists('data/pagerank.pdf'))
def test_doc_add_with_move(self):
cmds = ['pubs init -p paper_second/',
'pubs add data/pagerank.bib',
'pubs doc add --move data/pagerank.pdf Page99'
]
self.execute_cmds(cmds)
self.assertFalse(os.path.exists('data/pagerank.pdf'))
def test_doc_remove(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib',
'pubs doc add data/pagerank.pdf Page99',
('pubs doc remove Page99', ['y']),
]
self.execute_cmds(cmds)
docdir = os.path.expanduser('~/.pubs/doc/')
self.assertNotIn('turing-mind-1950.pdf', os.listdir(docdir))
def test_doc_export(self):
cmds = ['pubs init',
'pubs add data/pagerank.bib',
'pubs rename Page99 page100',
'pubs doc add data/pagerank.pdf page100',
'pubs doc export page100 /'
]
self.execute_cmds(cmds)
self.assertIn('page100.pdf', os.listdir('/'))
9 years ago
def test_alternate_config(self):
alt_conf = os.path.expanduser('~/.alt_conf')
9 years ago
cmds = ['pubs -c ' + alt_conf + ' init',
'pubs --config ' + alt_conf + ' import data/ Page99',
6 years ago
'pubs list -c ' + alt_conf,
9 years ago
]
outs = self.execute_cmds(cmds)
# check if pubs works as expected
self.assertEqual(1 + 1, len(outs[-1].split('\n')))
# check whether we actually changed the config file
self.assertFalse(os.path.isfile(self.default_conf_path))
self.assertTrue(os.path.isfile(alt_conf))
6 years ago
with open(alt_conf, 'r') as fd:
conf_text = fd.read()
outs = self.execute_cmds([('pubs conf -c ' + alt_conf, conf_text)])
def test_statistics(self):
cmds = ['pubs init',
7 years ago
'pubs statistics',
'pubs add data/pagerank.bib',
'pubs add -d data/turing-mind-1950.pdf data/turing1950.bib',
'pubs add data/martius.bib',
'pubs add data/10.1371%2Fjournal.pone.0038236.bib',
'pubs tag Page99 A+B',
'pubs tag turing1950computing C',
'pubs statistics',
]
out = self.execute_cmds(cmds)
7 years ago
lines = out[1].splitlines()
self.assertEqual(lines[0], 'Your pubs repository is empty.')
lines = out[-1].splitlines()
self.assertEqual(lines[0], 'Repository statistics:')
self.assertEqual(lines[1], 'Total papers: 4, 1 (25%) have a document attached')
self.assertEqual(lines[2], 'Total tags: 3, 2 (50%) of papers have at least one tag')
def test_add_no_extension(self):
"""This tests checks that a paper which document has no extension does
not raise issues when listing. This test might be removed if decided to
prevent such documents. It would then need to be replaced by a check
that this is prevented."""
self.fs.add_real_file(os.path.join(self.rootpath, 'data', 'pagerank.pdf'),
target_path=os.path.join('data', 'no-ext'))
correct = ['Initializing pubs in /pubs\n',
'added to pubs:\n[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) \n'
'data/no-ext was copied to the pubs repository.\n',
'[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) [NOEXT] \n',
]
cmds = ['pubs init -p /pubs',
'pubs add -d data/no-ext data/pagerank.bib',
'pubs list',
]
self.assertEqual(correct, self.execute_cmds(cmds, capture_output=True))
@mock.patch('pubs.apis.requests.get', side_effect=mock_requests.mock_requests_get)
def test_readme(self, reqget):
"""Test that the readme example work."""
self.fs.add_real_file(os.path.join(self.rootpath, 'data/pagerank.pdf'), target_path='data/Loeb_2012.pdf')
self.fs.add_real_file(os.path.join(self.rootpath, 'data/pagerank.pdf'), target_path='data/oyama2000the.pdf')
self.fs.add_real_file(os.path.join(self.rootpath, 'data/pagerank.pdf'), target_path='data/Knuth1995.pdf')
cmds = ['pubs init',
'pubs import data/collection.bib',
'pubs add data/pagerank.bib -d data/pagerank.pdf',
#'pubs add -D 10.1007/s00422-012-0514-6 -d data/pagerank.pdf',
'pubs add -I 978-0822324669 -d data/oyama2000the.pdf',
'pubs add -X math/9501234 -d data/Knuth1995.pdf',
'pubs add -D 10.1007/s00422-012-0514-6',
'pubs doc add data/Loeb_2012.pdf Loeb_2012',
]
self.execute_cmds(cmds, capture_output=True)
# self.assertEqual(correct, self.execute_cmds(cmds, capture_output=True))
@ddt.ddt
class TestCache(DataCommandTestCase):
"""\
Run tests on fake filesystems supporting both integers and nanosecond
stat times.
"""
def setUp(self):
pass
@ddt.data(True, False)
def test_remove(self, nsec_stat):
DataCommandTestCase.setUp(self, nsec_stat=nsec_stat)
cmds = ['pubs init',
'pubs add data/pagerank.bib',
('pubs remove Page99', ['y']),
'pubs list',
]
out = self.execute_cmds(cmds)
self.assertEqual(1, len(out[3].split('\n')))
@ddt.data(True, False)
def test_edit(self, nsec_stat):
DataCommandTestCase.setUp(self, nsec_stat=nsec_stat)
bib = str_fixtures.bibtex_external0
bib1 = re.sub('year = \{1999\}', 'year = {2007}', bib)
line = '[Page99] Page, Lawrence et al. "The PageRank Citation Ranking: Bringing Order to the Web." (1999) \n'
line1 = re.sub('1999', '2007', line)
cmds = ['pubs init',
'pubs add data/pagerank.bib',
'pubs list',
('pubs edit Page99', [bib1]),
'pubs list',
]
out = self.execute_cmds(cmds)
self.assertEqual(line, out[2])
self.assertEqual(line1, out[4])
if __name__ == '__main__':
unittest.main(verbosity=2)