Passed
Push — master ( 505fbe...1f069d )
by Stefan
01:57
created

test_read.test_3hourly_index()   A

Complexity

Conditions 1

Size

Total Lines 17
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 14
nop 2
dl 0
loc 17
rs 9.7
c 0
b 0
f 0
1
# -*- coding: utf-8 -*-
2
# vim:fileencoding=utf-8
3
#
4
# Copyright (c) 2020 Stefan Bender
5
#
6
# This module is part of pyspaceweather.
7
# pyspaceweather is free software: you can redistribute it or modify
8
# it under the terms of the GNU General Public License as published
9
# by the Free Software Foundation, version 2.
10
# See accompanying COPYING.GPLv2 file or http://www.gnu.org/licenses/gpl-2.0.html.
11
"""Space weather index read tests
12
"""
13
import os
14
15
import numpy as np
16
import pandas as pd
17
import requests
18
19
import pytest
20
21
from spaceweather import (
22
	ap_kp_3h, sw_daily, get_file_age, update_data,
23
	SW_PATH_ALL, SW_PATH_5Y,
24
)
25
from spaceweather.celestrak import DL_URL_5Y
26
27
28
def test_age():
29
	now = pd.Timestamp.utcnow()
30
	for p in [SW_PATH_ALL, SW_PATH_5Y]:
31
		assert os.path.exists(p)
32
		fage0 = get_file_age(p)
33
		fage1 = now - get_file_age(p, relative=False)
34
		assert (fage0 > pd.Timedelta("3h")) == (fage1 > pd.Timedelta("3h"))
35
		assert (fage0 > pd.Timedelta("1d")) == (fage1 > pd.Timedelta("1d"))
36
37
38
def _assert_age(p, age):
39
	assert os.path.exists(p)
40
	fage = get_file_age(p)
41
	assert fage < pd.Timedelta(age)
42
43
44
def test_update():
45
	update_data(min_age="100d")
46
	for (p, age) in zip([SW_PATH_ALL, SW_PATH_5Y], ["1460d", "100d"]):
47
		_assert_age(p, age)
48
49
50
def test_auto_update(mocker, tmpdir):
51
	# test with non-existent file
52
	mocker.patch("requests.get")
53
	tmpdir = str(tmpdir)
54
	update_data(swpath_5y=os.path.join(tmpdir, "foo.dat"))
55
	requests.get.assert_called_with(DL_URL_5Y, stream=True)
56
	# Should update the last-5-year data
57
	sw_daily(update=True, update_interval="1d")
58
	requests.get.assert_called_with(DL_URL_5Y, stream=True)
59
	_assert_age(SW_PATH_5Y, "100d")
60
	with pytest.warns(UserWarning):
61
		sw_daily(update=False, update_interval="0h")
62
63
64
def test_not_avail(mocker, tmpdir):
65
	# test with non-existent file
66
	mocker.patch("requests.get")
67
	tmpdir = str(tmpdir)
68
	tmpfile = os.path.join(tmpdir, "foo.dat")
69
	with pytest.warns(UserWarning):
70
		df = sw_daily(update=False, update_interval="0h", swpath_5y=tmpfile)
71
	assert df is None
72
	with pytest.warns(UserWarning):
73
		df = ap_kp_3h(update=False, update_interval="0h", swpath_5y=tmpfile)
74
	assert df is None
75
76
77
def test_daily():
78
	df = sw_daily()
79
	np.testing.assert_allclose(
80
		df.loc["2000-01-01"].values,
81
		np.array([
82
			2.000e+03, 1.000e+00, 1.000e+00, 2.272e+03, 7.000e+00, 5.300e+00, 4.700e+00,
83
			4.000e+00, 3.300e+00, 4.300e+00, 3.000e+00, 4.300e+00, 3.700e+00, 3.270e+01,
84
			5.600e+01, 3.900e+01, 2.700e+01, 1.800e+01, 3.200e+01, 1.500e+01, 3.200e+01,
85
			2.200e+01, 3.000e+01, 1.300e+00, 6.000e+00, 4.800e+01, 1.256e+02, 0.000e+00,
86
			1.605e+02, 1.750e+02, 1.299e+02, 1.656e+02, 1.790e+02,
87
		]),
88
		rtol=1e-12,
89
	)
90
91
92
@pytest.mark.parametrize(
93
	"name, result",
94
	[
95
		("Ap", np.array([56, 39, 27, 18, 32, 15, 32, 22])),
96
		("Kp", np.array([5.3, 4.7, 4.0, 3.3, 4.3, 3.0, 4.3, 3.7])),
97
	]
98
)
99
def test_3hourly_index(name, result):
100
	df = ap_kp_3h()
101
	np.testing.assert_allclose(
102
		df.loc[
103
			pd.date_range(
104
				"2000-01-01 01:30", "2000-01-01 23:30", freq="3h"
105
			)
106
		][name].values,
107
		result,
108
		rtol=1e-12,
109
	)
110