Skip to content

Commit

Permalink
Merge pull request #10 from axiom-data-science/testcov
Browse files Browse the repository at this point in the history
Adds unit tests for ERDDAP Catalog
  • Loading branch information
lukecampbell authored Oct 20, 2022
2 parents 6ef2ea3 + e78bcd2 commit a589e18
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 15 deletions.
52 changes: 37 additions & 15 deletions intake_erddap/erddap_cat.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
"""Catalog implementation for intake-erddap."""
from typing import Optional, Type

import pandas as pd

from erddapy import ERDDAP
from intake.catalog.base import Catalog
from intake.catalog.local import LocalCatalogEntry

from .erddap import ERDDAPSource
from .version import __version__


Expand All @@ -18,34 +23,51 @@ class ERDDAPCatalog(Catalog):
name = "erddap_cat"
version = __version__

def __init__(self, server, kwargs_search=None, **kwargs):
def __init__(
self,
server: str,
kwargs_search: Optional[dict] = None,
erddap_client: Optional[Type[ERDDAP]] = None,
**kwargs
):
"""ERDDAPCatalog initialization
Arguments
---------
server
"""
self._erddap_client = erddap_client or ERDDAP
self.server = server
self.kwargs_search = kwargs_search
super(ERDDAPCatalog, self).__init__(**kwargs)

def _load(self):

from .erddap import ERDDAPSource # , ERDDAPSourceAutoPartition

e = ERDDAP(self.server)
e.protocol = "tabledap"
e.dataset_id = "allDatasets"

def _load_df(self):
e = self.get_client()
if self.kwargs_search is not None:
search_url = e.get_search_url(
response="csv",
**self.kwargs_search,
# variableName=variable,
items_per_page=100000,
)
import pandas as pd

df = pd.read_csv(search_url)
dataidkey = "Dataset ID"
df.rename(columns={"Dataset ID": "datasetID"}, inplace=True)
return df

else:
df = e.to_pandas()
dataidkey = "datasetID"
return e.to_pandas()

def get_client(self) -> ERDDAP:
"""Return an initialized ERDDAP Client."""
e = self._erddap_client(self.server)
e.protocol = "tabledap"
e.dataset_id = "allDatasets"
return e

def _load(self):
dataidkey = "datasetID"
e = self.get_client()
df = self._load_df()

self._entries = {}

Expand Down
53 changes: 53 additions & 0 deletions tests/test_erddap_cat.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,60 @@
#!/usr/bin/env pytest
"""Unit tests."""
from unittest import mock

import intake
import pandas as pd
import pytest

from intake_erddap.erddap_cat import ERDDAPCatalog


def test_nothing():
"""This test exists to ensure that at least one test works."""
pass


@mock.patch("erddapy.ERDDAP.to_pandas")
def test_erddap_catalog(mock_to_pandas):
results = pd.DataFrame()
results["datasetID"] = ["abc123"]
mock_to_pandas.return_value = results
server = "http://erddap.invalid/erddap"
cat = ERDDAPCatalog(server=server)
assert list(cat) == ["abc123"]


@mock.patch("pandas.read_csv")
def test_erddap_catalog_searching(mock_read_csv):
results = pd.DataFrame()
results["datasetID"] = ["abc123"]
mock_read_csv.return_value = results
kw = {
"min_lon": -180,
"max_lon": -156,
"min_lat": 50,
"max_lat": 66,
"min_time": "2021-4-1",
"max_time": "2021-4-2",
}
server = "http://erddap.invalid/erddap"
cat = ERDDAPCatalog(server=server, kwargs_search=kw)
assert list(cat) == ["abc123"]


@pytest.mark.integration
def test_ioos_erddap_catalog_and_source():
kw = {
"min_lon": -180,
"max_lon": -156,
"min_lat": 50,
"max_lat": 66,
"min_time": "2021-4-1",
"max_time": "2021-4-2",
}
server = "http://erddap.sensors.ioos.us/erddap"
cat_sensors = intake.open_erddap_cat(server, kwargs_search=kw)
df = cat_sensors[list(cat_sensors)[0]].read()
assert df is not None
assert isinstance(df, pd.DataFrame)
assert len(df) > 0

0 comments on commit a589e18

Please sign in to comment.