def test_cutout_no_table(patch_get): casda = Casda() fake_login(casda, USERNAME, PASSWORD) casda.POLL_INTERVAL = 1 result = casda.cutout(None) assert result == []
def test_query_region_text_radius(self): ra = 333.9092 dec = -45.8418 radius = 0.5 query_payload = Casda.query_region('22h15m38.2s -45d50m30.5s', radius=radius * u.deg, cache=False, get_query_payload=True) assert isinstance(query_payload, dict) assert 'POS' in query_payload assert query_payload['POS'].startswith('CIRCLE 333') pos_parts = query_payload['POS'].split(' ') assert pos_parts[0] == 'CIRCLE' assert math.isclose(float(pos_parts[1]), ra, abs_tol=1e-4) assert math.isclose(float(pos_parts[2]), dec, abs_tol=1e-4) assert math.isclose(float(pos_parts[3]), radius) assert len(pos_parts) == 4 responses = Casda.query_region('22h15m38.2s -45d50m30.5s', radius=0.5 * u.arcmin, cache=False) assert isinstance(responses, Table) assert len(responses) > 1 print(responses[0]) for key in ('dataproduct_type', 'obs_id', 'access_url', 'access_format', 'obs_release_date'): assert key in responses.keys()
def test_query_region_async_box(patch_get): ra = 333.9092 dec = -45.8418 width = 0.5 height = 0.2 centre = SkyCoord(ra, dec, unit=('deg', 'deg')) query_payload = Casda.query_region_async(centre, width=width * u.deg, height=height * u.deg, cache=False, get_query_payload=True) assert isinstance(query_payload, dict) assert 'POS' in query_payload assert query_payload['POS'].startswith('RANGE 333') pos_parts = query_payload['POS'].split(' ') assert pos_parts[0] == 'RANGE' assert isclose(float(pos_parts[1]), ra - width / 2, abs_tol=1e-5) assert isclose(float(pos_parts[2]), ra + width / 2, abs_tol=1e-5) assert isclose(float(pos_parts[3]), dec - height / 2, abs_tol=1e-5) assert isclose(float(pos_parts[4]), dec + height / 2, abs_tol=1e-5) assert len(pos_parts) == 5 responses = Casda.query_region_async(centre, width=width * u.deg, height=height * u.deg, cache=False) assert isinstance(responses, MockResponse)
def test_stage_data_unauthorised(patch_get): table = Table() with pytest.raises(ValueError) as excinfo: Casda.stage_data(table) assert "Credentials must be supplied" in str(excinfo.value)
def test_stage_data_invalid_credentials(patch_get): prefix = 'https://somewhere/casda/datalink/links?' access_urls = [prefix + 'cube-220'] table = Table([Column(data=access_urls, name='access_url')]) casda = Casda('user', 'notthepassword') with pytest.raises(requests.exceptions.HTTPError) as excinfo: casda.stage_data(table)
def test_stage_data(patch_get): prefix = 'https://somewhere/casda/datalink/links?' access_urls = [prefix + 'cube-244'] table = Table([Column(data=access_urls, name='access_url')]) casda = Casda('user', 'password') casda.POLL_INTERVAL = 1 urls = casda.stage_data(table, verbose=True) assert urls == ['http://casda.csiro.au/download/web/111-000-111-000/askap_img.fits.checksum', 'http://casda.csiro.au/download/web/111-000-111-000/askap_img.fits']
def test_login_keyring(patch_get): casda = Casda() assert casda._authenticated is False assert casda.USERNAME == '' keyring.set_password("astroquery:casda.csiro.au", USERNAME, PASSWORD) casda.login(username=USERNAME) keyring.delete_password("astroquery:casda.csiro.au", USERNAME) assert casda._authenticated is True assert casda.USERNAME == USERNAME assert casda._auth == (USERNAME, PASSWORD)
def test_stage_data(self): prefix = 'https://data.csiro.au/casda_vo_proxy/vo/datalink/links?ID=' access_urls = [prefix + 'cube-1262'] table = Table([Column(data=access_urls, name='access_url')]) casda = Casda(os.environ['CASDA_USER'], os.environ['CASDA_PASSWD']) casda.POLL_INTERVAL = 3 urls = casda.stage_data(table) assert str(urls[0]).endswith('image_cube_g300to310.q.fits') assert str(urls[1]).endswith('image_cube_g300to310.q.fits.checksum') assert len(urls) == 2
def test_stage_data_no_link(patch_get): prefix = 'https://somewhere/casda/datalink/links?' access_urls = [prefix + 'cube-240'] table = Table([Column(data=access_urls, name='access_url')]) casda = Casda('user', 'password') casda.POLL_INTERVAL = 1 with pytest.raises(ValueError) as excinfo: casda.stage_data(table) assert "You do not have access to any of the requested data files." in str(excinfo.value)
def test_login_no_default_user(): casda = Casda() assert casda._authenticated is False assert casda.USERNAME == '' with pytest.raises( LoginError, match=r"If you do not pass a username to login\(\),") as excinfo: Casda.login() assert casda._authenticated is False assert casda.USERNAME == '' assert hasattr(casda, '_auth') is False
def test_stage_data_no_link(patch_get): prefix = 'https://somewhere/casda/datalink/links?' access_urls = [prefix + 'cube-240'] table = Table([Column(data=access_urls, name='access_url')]) casda = Casda() fake_login(casda, USERNAME, PASSWORD) casda.POLL_INTERVAL = 1 with pytest.raises( ValueError, match=r"You do not have access to any of the requested data files\." ) as excinfo: casda.stage_data(table)
def test_cutout_unauthorised(patch_get): prefix = 'https://somewhere/casda/datalink/links?' access_urls = [prefix + 'cube-244'] table = Table([Column(data=access_urls, name='access_url')]) ra = 333.9092 * u.deg dec = -45.8418 * u.deg radius = 30 * u.arcmin centre = SkyCoord(ra, dec) with pytest.raises( ValueError, match=r"Credentials must be supplied to download CASDA image data" ) as excinfo: Casda.cutout(table, coordinates=centre, radius=radius, verbose=True)
def test_args_to_payload_channel(patch_get): casda = Casda() fake_login(casda, USERNAME, PASSWORD) payload = casda._args_to_payload(channel=(0, 30)) assert payload['CHANNEL'] == '0 30' assert list(payload.keys()) == ['CHANNEL'] payload = casda._args_to_payload(channel=np.array([17, 23])) assert payload['CHANNEL'] == '17 23' assert list(payload.keys()) == ['CHANNEL'] payload = casda._args_to_payload(channel=(23, 17)) assert payload['CHANNEL'] == '17 23' assert list(payload.keys()) == ['CHANNEL']
def test_download_file(patch_get): urls = [ 'https://ingest.pawsey.org/bucket_name/path/askap_img.fits?security=stuff', 'http://casda.csiro.au/download/web/111-000-111-000/askap_img.fits.checksum', 'https://ingest.pawsey.org.au/casda-prd-as110-01/dc52217/primary_images/RACS-DR1_0000%2B18A.fits?security=stuff' ] casda = Casda() fake_login(casda, USERNAME, PASSWORD) # skip the actual downloading of the file download_mock = MagicMock() casda._download_file = download_mock filenames = casda.download_files(urls) assert filenames[0].endswith('askap_img.fits') assert filenames[1].endswith('askap_img.fits.checksum') assert filenames[2].endswith('RACS-DR1_0000+18A.fits')
def test_args_to_payload_combined(patch_get): casda = Casda() fake_login(casda, USERNAME, PASSWORD) cutout_coords = SkyCoord(ra=187.5 * u.degree, dec=-60.0 * u.degree, frame='icrs') payload = casda._args_to_payload(coordinates=cutout_coords, channel=(17, 23)) assert payload['POS'].startswith('CIRCLE 187') pos_parts = payload['POS'].split(' ') assert pos_parts[0] == 'CIRCLE' assert isclose(float(pos_parts[1]), 187.5, abs_tol=1e-4) assert isclose(float(pos_parts[2]), -60.0, abs_tol=1e-4) assert isclose(float(pos_parts[3]), 1 / 60) assert len(pos_parts) == 4 assert payload['CHANNEL'] == '17 23' assert set(payload.keys()) == set(['CHANNEL', 'POS'])
def test_args_to_payload_coordinates(patch_get): casda = Casda() fake_login(casda, USERNAME, PASSWORD) cutout_coords = SkyCoord(ra=345.245 * u.degree, dec=-32.125 * u.degree, frame='icrs') payload = casda._args_to_payload(coordinates=cutout_coords) assert payload['POS'].startswith('CIRCLE 345') pos_parts = payload['POS'].split(' ') assert pos_parts[0] == 'CIRCLE' assert isclose(float(pos_parts[1]), 345.245, abs_tol=1e-4) assert isclose(float(pos_parts[2]), -32.125, abs_tol=1e-4) assert isclose(float(pos_parts[3]), 1 / 60) assert len(pos_parts) == 4 assert list(payload.keys()) == ['POS'] cutout_coords = SkyCoord(ra=187.5 * u.degree, dec=-60.0 * u.degree, frame='icrs') payload = casda._args_to_payload(coordinates=cutout_coords, radius=900 * u.arcsec) assert payload['POS'].startswith('CIRCLE 187') pos_parts = payload['POS'].split(' ') assert pos_parts[0] == 'CIRCLE' assert isclose(float(pos_parts[1]), 187.5, abs_tol=1e-4) assert isclose(float(pos_parts[2]), -60.0, abs_tol=1e-4) assert isclose(float(pos_parts[3]), 0.25) assert len(pos_parts) == 4 assert list(payload.keys()) == ['POS'] cutout_coords = SkyCoord(ra=187.5 * u.degree, dec=-60.0 * u.degree, frame='icrs') payload = casda._args_to_payload(coordinates=cutout_coords, width=2 * u.arcmin, height=3 * u.arcmin) assert payload['POS'].startswith('RANGE 187') pos_parts = payload['POS'].split(' ') assert pos_parts[0] == 'RANGE' assert isclose(float(pos_parts[1]), 187.5 - 1 / 60, abs_tol=1e-4) assert isclose(float(pos_parts[2]), 187.5 + 1 / 60, abs_tol=1e-4) assert isclose(float(pos_parts[3]), -60.0 - 1.5 / 60, abs_tol=1e-4) assert isclose(float(pos_parts[4]), -60.0 + 1.5 / 60, abs_tol=1e-4) assert len(pos_parts) == 5 assert list(payload.keys()) == ['POS']
def test_cutout(patch_get): prefix = 'https://somewhere/casda/datalink/links?' access_urls = [prefix + 'cube-244'] table = Table([Column(data=access_urls, name='access_url')]) ra = 333.9092 * u.deg dec = -45.8418 * u.deg radius = 30 * u.arcmin centre = SkyCoord(ra, dec) casda = Casda() fake_login(casda, USERNAME, PASSWORD) casda.POLL_INTERVAL = 1 urls = casda.cutout(table, coordinates=centre, radius=radius, verbose=True) assert urls == [ 'http://casda.csiro.au/download/web/111-000-111-000/cutout.fits.checksum', 'http://casda.csiro.au/download/web/111-000-111-000/cutout.fits' ]
def test_query_region_async_radius(patch_get): ra = 333.9092 dec = -45.8418 radius = 0.5 centre = SkyCoord(ra, dec, unit=('deg', 'deg')) query_payload = Casda.query_region_async(centre, radius=radius * u.deg, cache=False, get_query_payload=True) assert isinstance(query_payload, dict) assert 'POS' in query_payload assert query_payload['POS'].startswith('CIRCLE 333') pos_parts = query_payload['POS'].split(' ') assert pos_parts[0] == 'CIRCLE' assert isclose(float(pos_parts[1]), ra, abs_tol=1e-5) assert isclose(float(pos_parts[2]), dec, abs_tol=1e-5) assert isclose(float(pos_parts[3]), radius) assert len(pos_parts) == 4 responses = Casda.query_region_async(centre, radius=0.5 * u.deg, cache=False) assert isinstance(responses, MockResponse)
def test_cutout_no_args(patch_get): prefix = 'https://somewhere/casda/datalink/links?' access_urls = [prefix + 'cube-244'] table = Table([Column(data=access_urls, name='access_url')]) ra = 333.9092 * u.deg dec = -45.8418 * u.deg radius = 30 * u.arcmin centre = SkyCoord(ra, dec) casda = Casda() fake_login(casda, USERNAME, PASSWORD) casda.POLL_INTERVAL = 1 with pytest.raises( ValueError, match= r"Please provide cutout parameters such as coordinates, band or channel\." ) as excinfo: casda.cutout(table)
def test_query_region_text_radius(patch_get): ra = 333.9092 dec = -45.8418 radius = 0.5 query_payload = Casda.query_region('22h15m38.2s -45d50m30.5s', radius=radius * u.deg, cache=False, get_query_payload=True) assert isinstance(query_payload, dict) assert 'POS' in query_payload assert query_payload['POS'].startswith('CIRCLE 333') pos_parts = query_payload['POS'].split(' ') assert pos_parts[0] == 'CIRCLE' assert isclose(float(pos_parts[1]), ra, abs_tol=1e-4) assert isclose(float(pos_parts[2]), dec, abs_tol=1e-4) assert isclose(float(pos_parts[3]), radius) assert len(pos_parts) == 4 responses = Casda.query_region('22h15m38.2s -45d50m30.5s', radius=0.5 * u.deg, cache=False) assert isinstance(responses, Table) assert len(responses) == 3
def test_filter_out_unreleased(): all_records = parse(data_path('partial_unreleased.xml'), verify='warn').get_first_table().to_table() assert all_records[0]['obs_release_date'] == '2017-08-02T03:51:19.728Z' assert all_records[1]['obs_release_date'] == '2218-01-02T16:51:00.728Z' assert all_records[2]['obs_release_date'] == '' assert len(all_records) == 3 # This should filter out the rows with either a future obs_release_date or no obs_release_date filtered = Casda.filter_out_unreleased(all_records) assert filtered[0]['obs_release_date'] == '2017-08-02T03:51:19.728Z' assert filtered[0]['obs_publisher_did'] == 'cube-502' assert len(filtered) == 1
def test_args_to_payload_channel_invalid(patch_get): casda = Casda() fake_login(casda, USERNAME, PASSWORD) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(channel='one') assert "The 'channel' value must be a list of 2 integer values." in str( excinfo.value) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(channel=(1.42 * u.GHz, 1.5 * u.GHz)) assert "The 'channel' value must be a list of 2 integer values." in str( excinfo.value) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(channel=(None, 5)) assert "The 'channel' value must be a list of 2 integer values." in str( excinfo.value) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(channel=(5)) assert "The 'channel' value must be a list of 2 integer values." in str( excinfo.value)
def test_stage_data_invalid_credentials(patch_get): prefix = 'https://somewhere/casda/datalink/links?' access_urls = [prefix + 'cube-220'] table = Table([Column(data=access_urls, name='access_url')]) casda = Casda() # Update the casda object to indicate that it has been authenticated casda.USERNAME = USERNAME casda._auth = (USERNAME, 'notthepassword') casda._authenticated = True with pytest.raises(requests.exceptions.HTTPError) as excinfo: casda.stage_data(table)
def test_cutout(self, cached_credentials): prefix = 'https://data.csiro.au/casda_vo_proxy/vo/datalink/links?ID=' access_urls = [prefix + 'cube-44705'] table = Table([Column(data=access_urls, name='access_url')]) casda = Casda() casda.login(username=os.environ['CASDA_USER']) casda.POLL_INTERVAL = 3 pos = SkyCoord(196.49583333 * u.deg, -62.7 * u.deg) urls = casda.cutout(table, coordinates=pos, radius=15 * u.arcmin) # URLs may come back in any order for url in urls: if url.endswith('.checksum'): checksum_url = str(url) else: cutout_url = str(url) assert cutout_url.endswith('-imagecube-44705.fits') assert 'cutout-' in cutout_url assert checksum_url.endswith('-imagecube-44705.fits.checksum') assert len(urls) == 2
def test_stage_data_unauthorised(patch_get): table = Table() with pytest.raises(ValueError, match=r"Credentials must be supplied") as excinfo: Casda.stage_data(table)
def test_stage_data_empty(patch_get): table = Table() casda = Casda('user', 'password') urls = casda.stage_data(table) assert urls == []
def test_stage_data_empty(patch_get): table = Table() casda = Casda() fake_login(casda, USERNAME, PASSWORD) urls = casda.stage_data(table) assert urls == []
def test_args_to_payload_band(patch_get): casda = Casda() fake_login(casda, USERNAME, PASSWORD) payload = casda._args_to_payload(band=(0.195 * u.m, 0.215 * u.m)) assert payload['BAND'] == '0.195 0.215' assert list(payload.keys()) == ['BAND'] payload = casda._args_to_payload(band=(0.215 * u.m, 0.195 * u.m)) assert payload['BAND'] == '0.195 0.215' assert list(payload.keys()) == ['BAND'] payload = casda._args_to_payload(band=(0.195 * u.m, 21.5 * u.cm)) assert payload['BAND'] == '0.195 0.215' assert list(payload.keys()) == ['BAND'] payload = casda._args_to_payload(band=(None, 0.215 * u.m)) assert payload['BAND'] == '-Inf 0.215' assert list(payload.keys()) == ['BAND'] payload = casda._args_to_payload(band=(0.195 * u.m, None)) assert payload['BAND'] == '0.195 +Inf' assert list(payload.keys()) == ['BAND'] payload = casda._args_to_payload(band=(1.42 * u.GHz, 1.5 * u.GHz)) assert payload['BAND'] == '0.19986163866666667 0.21112144929577467' assert list(payload.keys()) == ['BAND'] payload = casda._args_to_payload(band=np.array([1.5, 1.42]) * u.GHz) assert payload['BAND'] == '0.19986163866666667 0.21112144929577467' assert list(payload.keys()) == ['BAND'] payload = casda._args_to_payload(band=(None, 1.5 * u.GHz)) assert payload['BAND'] == '0.19986163866666667 +Inf' assert list(payload.keys()) == ['BAND'] payload = casda._args_to_payload(band=(1.42 * u.GHz, None)) assert payload['BAND'] == '-Inf 0.21112144929577467' assert list(payload.keys()) == ['BAND']
def test_args_to_payload_band_invalid(patch_get): casda = Casda() fake_login(casda, USERNAME, PASSWORD) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(band='foo') assert "The 'band' value must be a list of 2 wavelength or frequency values." in str( excinfo.value) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(band=(0.195 * u.m, 0.215 * u.m, 0.3 * u.m)) assert "The 'band' value must be a list of 2 wavelength or frequency values." in str( excinfo.value) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(band=('a', 0.215 * u.m)) assert "The 'band' value must be a list of 2 wavelength or frequency values." in str( excinfo.value) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(band=(1.42 * u.GHz, 21 * u.cm)) assert "The 'band' values must have the same kind of units." in str( excinfo.value) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(band=[1.42 * u.radian, 21 * u.deg]) assert "The 'band' values must be wavelengths or frequencies." in str( excinfo.value) with pytest.raises(ValueError) as excinfo: casda._args_to_payload(band=(1.42 * u.GHz, 1.5 * u.GHz), channel=(5, 10)) assert "Either 'channel' or 'band' values may be provided but not both." in str( excinfo.value)