2014-08-12 03:15:55 +02:00
|
|
|
import sys
|
|
|
|
import datetime
|
|
|
|
import os
|
|
|
|
from contextlib import contextmanager
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
import pretend
|
|
|
|
|
|
|
|
import pip
|
|
|
|
from pip._vendor import lockfile
|
2014-09-18 13:36:40 +02:00
|
|
|
from pip.utils import outdated
|
2014-08-12 03:15:55 +02:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
['stored_time', 'newver', 'check', 'warn'],
|
|
|
|
[
|
|
|
|
('1970-01-01T10:00:00Z', '2.0', True, True),
|
|
|
|
('1970-01-01T10:00:00Z', '1.0', True, False),
|
|
|
|
('1970-01-06T10:00:00Z', '1.0', False, False),
|
|
|
|
('1970-01-06T10:00:00Z', '2.0', False, True),
|
|
|
|
]
|
|
|
|
)
|
2014-09-18 13:36:40 +02:00
|
|
|
def test_pip_version_check(monkeypatch, stored_time, newver, check, warn):
|
2014-08-12 03:15:55 +02:00
|
|
|
monkeypatch.setattr(pip, '__version__', '1.0')
|
|
|
|
|
|
|
|
resp = pretend.stub(
|
|
|
|
raise_for_status=pretend.call_recorder(lambda: None),
|
|
|
|
json=pretend.call_recorder(lambda: {"info": {"version": newver}}),
|
|
|
|
)
|
|
|
|
session = pretend.stub(
|
|
|
|
get=pretend.call_recorder(lambda u, headers=None: resp),
|
|
|
|
)
|
|
|
|
|
|
|
|
fake_state = pretend.stub(
|
|
|
|
state={"last_check": stored_time, 'pypi_version': '1.0'},
|
|
|
|
save=pretend.call_recorder(lambda v, t: None),
|
|
|
|
)
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
monkeypatch.setattr(
|
|
|
|
outdated, 'load_selfcheck_statefile', lambda: fake_state
|
|
|
|
)
|
2014-08-12 03:15:55 +02:00
|
|
|
|
|
|
|
fake_now = datetime.datetime(1970, 1, 9, 10, 00, 00)
|
|
|
|
|
|
|
|
fake_datetime = pretend.stub(
|
|
|
|
utcnow=pretend.call_recorder(lambda: fake_now),
|
|
|
|
strptime=datetime.datetime.strptime,
|
|
|
|
)
|
|
|
|
monkeypatch.setattr(datetime, 'datetime', fake_datetime)
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
monkeypatch.setattr(outdated.logger, 'warning',
|
2014-08-12 03:15:55 +02:00
|
|
|
pretend.call_recorder(lambda s: None))
|
2014-09-18 13:36:40 +02:00
|
|
|
monkeypatch.setattr(outdated.logger, 'debug',
|
2014-08-12 03:15:55 +02:00
|
|
|
pretend.call_recorder(lambda s, exc_info=None: None))
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
outdated.pip_version_check(session)
|
2014-08-12 03:15:55 +02:00
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
assert not outdated.logger.debug.calls
|
2014-08-12 03:15:55 +02:00
|
|
|
|
|
|
|
if check:
|
|
|
|
assert session.get.calls == [pretend.call(
|
|
|
|
"https://pypi.python.org/pypi/pip/json",
|
|
|
|
headers={"Accept": "application/json"}
|
|
|
|
)]
|
|
|
|
assert fake_state.save.calls == [pretend.call(newver, fake_now)]
|
|
|
|
if warn:
|
2014-09-18 13:36:40 +02:00
|
|
|
assert len(outdated.logger.warning.calls) == 1
|
2014-08-12 03:15:55 +02:00
|
|
|
else:
|
2014-09-18 13:36:40 +02:00
|
|
|
assert len(outdated.logger.warning.calls) == 0
|
2014-08-12 03:15:55 +02:00
|
|
|
else:
|
|
|
|
assert session.get.calls == []
|
|
|
|
assert fake_state.save.calls == []
|
|
|
|
|
|
|
|
|
|
|
|
def test_virtualenv_state(monkeypatch):
|
|
|
|
CONTENT = '{"last_check": "1970-01-02T11:00:00Z", "pypi_version": "1.0"}'
|
|
|
|
fake_file = pretend.stub(
|
|
|
|
read=pretend.call_recorder(lambda: CONTENT),
|
|
|
|
write=pretend.call_recorder(lambda s: None),
|
|
|
|
)
|
|
|
|
|
|
|
|
@pretend.call_recorder
|
|
|
|
@contextmanager
|
|
|
|
def fake_open(filename, mode='r'):
|
|
|
|
yield fake_file
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
monkeypatch.setattr(outdated, 'open', fake_open, raising=False)
|
2014-08-12 03:15:55 +02:00
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
monkeypatch.setattr(outdated, 'running_under_virtualenv',
|
2014-08-12 03:15:55 +02:00
|
|
|
pretend.call_recorder(lambda: True))
|
|
|
|
|
|
|
|
monkeypatch.setattr(sys, 'prefix', 'virtually_env')
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
state = outdated.load_selfcheck_statefile()
|
2014-08-12 03:15:55 +02:00
|
|
|
state.save('2.0', datetime.datetime.utcnow())
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
assert len(outdated.running_under_virtualenv.calls) == 1
|
2014-08-12 03:15:55 +02:00
|
|
|
|
|
|
|
expected_path = os.path.join('virtually_env', 'pip-selfcheck.json')
|
|
|
|
assert fake_open.calls == [
|
|
|
|
pretend.call(expected_path),
|
|
|
|
pretend.call(expected_path, 'w'),
|
|
|
|
]
|
|
|
|
|
|
|
|
# json.dumps will call this a number of times
|
|
|
|
assert len(fake_file.write.calls)
|
|
|
|
|
|
|
|
|
|
|
|
def test_global_state(monkeypatch):
|
|
|
|
CONTENT = '''{"pip_prefix": {"last_check": "1970-01-02T11:00:00Z",
|
|
|
|
"pypi_version": "1.0"}}'''
|
|
|
|
fake_file = pretend.stub(
|
|
|
|
read=pretend.call_recorder(lambda: CONTENT),
|
|
|
|
write=pretend.call_recorder(lambda s: None),
|
|
|
|
)
|
|
|
|
|
|
|
|
@pretend.call_recorder
|
|
|
|
@contextmanager
|
|
|
|
def fake_open(filename, mode='r'):
|
|
|
|
yield fake_file
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
monkeypatch.setattr(outdated, 'open', fake_open, raising=False)
|
2014-08-12 03:15:55 +02:00
|
|
|
|
|
|
|
@pretend.call_recorder
|
|
|
|
@contextmanager
|
|
|
|
def fake_lock(filename):
|
|
|
|
yield
|
|
|
|
|
|
|
|
monkeypatch.setattr(lockfile, 'LockFile', fake_lock)
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
monkeypatch.setattr(outdated, 'running_under_virtualenv',
|
2014-08-12 03:15:55 +02:00
|
|
|
pretend.call_recorder(lambda: False))
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
monkeypatch.setattr(outdated, 'USER_CACHE_DIR', 'cache_dir')
|
2014-08-12 03:15:55 +02:00
|
|
|
monkeypatch.setattr(sys, 'prefix', 'pip_prefix')
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
state = outdated.load_selfcheck_statefile()
|
2014-08-12 03:15:55 +02:00
|
|
|
state.save('2.0', datetime.datetime.utcnow())
|
|
|
|
|
2014-09-18 13:36:40 +02:00
|
|
|
assert len(outdated.running_under_virtualenv.calls) == 1
|
2014-08-12 03:15:55 +02:00
|
|
|
|
|
|
|
expected_path = os.path.join('cache_dir', 'selfcheck.json')
|
|
|
|
assert fake_lock.calls == [pretend.call(expected_path)]
|
|
|
|
|
|
|
|
assert fake_open.calls == [
|
|
|
|
pretend.call(expected_path),
|
|
|
|
pretend.call(expected_path),
|
|
|
|
pretend.call(expected_path, 'w'),
|
|
|
|
]
|
|
|
|
|
|
|
|
# json.dumps will call this a number of times
|
|
|
|
assert len(fake_file.write.calls)
|