debian-skyfield/skyfield/tests/test_io.py

90 lines
2.7 KiB
Python

"""Test whether Skyfield handles file download and file age correctly."""
import os
import shutil
import tempfile
from contextlib import contextmanager
from datetime import date
try:
from unittest.mock import patch
except ImportError:
from mock import patch
from skyfield import api
old_content = (b' 2015 10 1 67.9546\n'
b' 2015 11 1 68.0055\n'
b' 2015 12 1 68.0514\n'
b' 2016 1 1 68.1024\n')
new_content = (old_content +
b' 2016 2 1 68.1577\n')
def load():
path = tempfile.mkdtemp()
try:
yield api.Loader(path)
finally:
shutil.rmtree(path)
def save_file(load, content=old_content):
with open(load.path_to('deltat.data'), 'wb') as f:
f.write(content)
def file_contents(load):
with open(load.path_to('deltat.data'), 'rb') as f:
return f.read()
@contextmanager
def on(load, year, month, day):
fake_date = date(year, month, day)
download = lambda *args, **kw: save_file(load, new_content)
with patch('skyfield.iokit.download', download):
# Python 2.6 does not support the comma "with" statement, so:
with patch('skyfield.iokit.today', lambda *args: fake_date):
yield
# The tests.
def test_build_url(load):
url = 'ftp://ssd.jpl.nasa.gov/pub/eph/planets/bsp/de421.bsp'
assert load.build_url('de421.bsp') == url
assert load.build_url('unknown.kind.of.file') is None
def test_open_in_main_directory(load):
with open(os.path.join(load.directory, 'file.tle'), 'wb') as f:
f.write(b'example text\n')
data = load.open('file.tle').read()
print(repr(data))
assert data == b'example text\n'
def test_open_in_subdirectory(load):
os.mkdir(os.path.join(load.directory, 'folder'))
with open(os.path.join(load.directory, 'folder', 'file.tle'), 'wb') as f:
f.write(b'example text\n')
data = load.open('folder/file.tle').read()
assert data == b'example text\n'
def test_missing_file_gets_downloaded(load):
with on(load, 2016, 1, 15):
data = load('deltat.data')
assert file_contents(load).endswith(b' 68.1577\n')
assert data[1][-1] == 68.1577
def test_11_month_old_file_gets_reused(load):
save_file(load)
with on(load, 2016, 12, 15):
data = load('deltat.data')
assert file_contents(load).endswith(b' 68.1024\n')
assert data[1][-1] == 68.1024
def test_12_month_old_file_gets_redownloaded(load):
save_file(load)
with on(load, 2017, 1, 15):
data = load('deltat.data')
assert file_contents(load).endswith(b' 68.1577\n')
assert data[1][-1] == 68.1577
def test_builtin_timescale(load):
ts = load.timescale(builtin=True)
ts.utc(2019, 7, 21, 11, 11)