def test_fetch_model_bad_created(web_server) -> None: url = web_server('bad_created.h5') with pytest.raises(models.DataError, match='Invalid creation timestamp') as exc_info: fetch_requests.fetch_model(url, DummyModel) assert exc_info.value.url == url assert exc_info.value.original_url == url
def test_bad_shape(mock_responses) -> None: url = get_data_url('band_mask_ranges_2d.h5') with pytest.raises( models.DataError, match='ranges dataset should be 1-dimensional, but is 2-dimensional' ): fetch_requests.fetch_model(url, band_mask.BandMask)
def test_fetch_model_model_version_error(filename, web_server) -> None: url = web_server(filename) with pytest.raises(models.ModelVersionError) as exc_info: fetch_requests.fetch_model(url, DummyModel) assert exc_info.value.url == url assert exc_info.value.original_url == url assert 'model_version' in str(exc_info.value)
def test_fetch_model_too_many_aliases(web_server, monkeypatch) -> None: monkeypatch.setattr(fetch, 'MAX_ALIASES', 1) with pytest.raises(models.TooManyAliasesError): fetch_requests.fetch_model(web_server('indirect.alias'), DummyModel) # Check that 1 level of alias is still permitted with fetch_requests.fetch_model(web_server('direct.alias'), DummyModel): pass
def test_custom_session(web_server) -> None: session = DummySession() with session: fetch_requests.fetch_model(web_server('direct.alias'), DummyModel, session=session) assert session.calls == 2 assert not session.closed assert session.closed
def test_fetch_model_checksum_bad(mock_responses) -> None: data = get_data('rfi_mask_ranges.h5') digest = hashlib.sha256(data).hexdigest() url = get_data_url(f'sha256_{digest}.h5') # Now invalidate the digest data += b'blahblahblah' mock_responses.add(responses.GET, url, content_type='application/x-hdf5', body=data) with pytest.raises(models.ChecksumError) as exc_info: fetch_requests.fetch_model(url, DummyModel) assert exc_info.value.url == url
def serve_model(model_file: h5py.File) \ -> Generator[primary_beam.PrimaryBeamAperturePlane, None, None]: path = pathlib.Path(model_file.filename) model_file.close() # Ensures data is written to the file with fetch_requests.fetch_model(path.as_uri(), primary_beam.PrimaryBeam) as model: yield cast(primary_beam.PrimaryBeamAperturePlane, model)
def test_fetch_model_retry(web_server) -> None: """Test that retry happens on a 5xx server error.""" url = web_server('rfi_mask_ranges.h5').replace('/static/', '/failonce/') with fetch_requests.fetch_model(url, DummyModel) as model: assert len(model.ranges) == 2 assert not model.is_closed assert model.is_closed
def test_fetch_model_http_redirect(mock_responses) -> None: url = get_data_url('subdir/redirect.alias') mock_responses.add(responses.GET, url, headers={'Location': '../direct.alias'}, status=307) with fetch_requests.fetch_model(url, DummyModel) as model: assert len(model.ranges) == 2
def test_metadata(web_server) -> None: with fetch_requests.fetch_model( web_server('rfi_mask_ranges_metadata.h5'), rfi_mask.RFIMask) as model: assert model.comment == 'Test model' assert model.author == 'Test author' assert model.target == 'Test target' assert model.created is not None assert model.created.isoformat() == '2020-06-11T11:11:00+00:00'
def test_fetch_model_checksum_ok(mock_responses) -> None: data = get_data('rfi_mask_ranges.h5') digest = hashlib.sha256(data).hexdigest() url = get_data_url(f'sha256_{digest}.h5') mock_responses.add(responses.GET, url, content_type='application/x-hdf5', body=data) with fetch_requests.fetch_model(url, DummyModel) as model: assert model.checksum == digest
def test_fetch_model_bad_http_status(filename, web_server) -> None: url = web_server(filename) with pytest.raises(requests.HTTPError) as exc_info: fetch_requests.fetch_model(url, DummyModel) assert exc_info.value.response.status_code == 404
def test_fetch_model_not_hdf5(web_server) -> None: url = web_server('not_hdf5.h5') with pytest.raises(models.DataError) as exc_info: fetch_requests.fetch_model(url, DummyModel) assert exc_info.value.url == url assert exc_info.value.original_url == url
def test_fetch_model_model_type_error(filename, web_server) -> None: url = web_server(filename) with pytest.raises(models.ModelTypeError, match='rfi_mask') as exc_info: fetch_requests.fetch_model(url, DummyModel) assert exc_info.value.url == url assert exc_info.value.original_url == url
def test_fetch_model_absolute_alias(web_server) -> None: url = web_server('to_file.alias') with pytest.raises(models.AbsoluteAliasError) as exc_info: fetch_requests.fetch_model(url, DummyModel) assert exc_info.value.url == url assert exc_info.value.original_url == url
def test_missing_dataset(filename: str, mock_responses) -> None: url = get_data_url(filename) with pytest.raises(models.DataError, match='Model is missing ranges dataset'): fetch_requests.fetch_model(url, rfi_mask.RFIMask)
def test_fetch_model_alias_loop(web_server) -> None: url = web_server('loop.alias') with pytest.raises(models.TooManyAliasesError) as exc_info: fetch_requests.fetch_model(url, DummyModel) assert exc_info.value.url == url assert exc_info.value.original_url == url
def test_fetch_model_simple(use_file, filename, web_server) -> None: url = get_file_url(filename) if use_file else web_server(filename) with fetch_requests.fetch_model(url, DummyModel) as model: assert len(model.ranges) == 2 assert not model.is_closed assert model.is_closed
def test_bad_model_format(mock_responses) -> None: url = get_data_url('band_mask_bad_format.h5') with pytest.raises(models.ModelFormatError) as exc_info: fetch_requests.fetch_model(url, band_mask.BandMask) assert str( exc_info.value) == "Unknown model_format 'not_ranges' for band_mask"
def test_fetch_model_connection_error(mock_responses) -> None: # responses raises ConnectionError for any unregistered URL with pytest.raises(requests.ConnectionError): fetch_requests.fetch_model(get_data_url('does_not_exist.h5'), DummyModel)
def ranges_model(web_server) -> Generator[rfi_mask.RFIMask, None, None]: with fetch_requests.fetch_model(web_server('rfi_mask_ranges.h5'), rfi_mask.RFIMask) as model: yield model
def serve_model(model_file: h5py.File) -> Generator[sefd.SEFDPoly, None, None]: path = pathlib.Path(model_file.filename) model_file.close() # Ensures data is written to the file with fetch_requests.fetch_model(path.as_uri(), sefd.SEFDModel) as model: yield cast(sefd.SEFDPoly, model)
def ranges_model(web_server) -> Generator[band_mask.BandMask, None, None]: with fetch_requests.fetch_model(web_server('band_mask_ranges.h5'), band_mask.BandMask) as model: yield model