def test_add_observation(get_access_token, requests_mock): requests_mock.post( f'{API_V1_BASE_URL}/project_observations', json=SAMPLE_DATA['add_project_observation'], status_code=200, ) observation_ids = 5678, 9012 iNatClient().projects.add_observations(1234, *observation_ids) get_access_token.assert_called()
def test_from_ids(requests_mock): project_id = 8291 requests_mock.get( f'{API_V1_BASE_URL}/projects/{project_id}', json={ 'results': [j_project_1, j_project_2], 'total_results': 2 }, status_code=200, ) results = iNatClient().projects.from_ids(project_id).all() project = results[0] assert len(results) == 2 and isinstance(project, Project) assert project.id == project_id assert project.location == (48.777404, -122.306929) assert project.project_observation_rules == project.obs_rules assert project.obs_rules[0]['id'] == 19344 assert project.search_parameters[0]['field'] == 'quality_grade' assert project.user_ids[-1] == 3387092 and len(project.user_ids) == 33 admin = project.admins[0] assert isinstance( admin, ProjectUser) and admin.id == 233188 and admin.role == 'manager' assert isinstance(project.user, User) and project.user.id == 233188
def test_client_settings(client_settings, request_params, expected_params): """Client settings should be applied as defaults, and not override explicit kw arguments""" client = iNatClient(**client_settings) final_params = client.request(request_function, **request_params) for k, v in expected_params.items(): assert final_params[k] == v
def test_search(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/projects', json=SAMPLE_DATA['get_projects'], status_code=200, ) results = (iNatClient().projects.search( q='invasive', lat=49.27, lng=-123.08, radius=400, order_by='distance', ).all()) project = results[0] assert len(results) == 5 and isinstance(project, Project) assert project.id == 8291 assert project.title == 'PNW Invasive Plant EDDR' assert project.is_umbrella is False assert len(project.user_ids) == 33 assert project.created_at == datetime(2016, 7, 20, 23, 0, 5, tzinfo=tzutc()) assert project.updated_at == datetime(2020, 7, 28, 20, 9, 49, tzinfo=tzutc())
def test_get_places_autocomplete__all_pages(requests_mock): page_1 = {'total_results': 25, 'results': [{'id': i} for i in range(20)]} page_2 = { 'total_results': 25, 'results': [{ 'id': i } for i in range(15, 25)] } requests_mock.get( f'{API_V1_BASE_URL}/places/autocomplete', [ { 'json': page_1, 'status_code': 200 }, { 'json': page_2, 'status_code': 200 }, ], ) results = iNatClient().places.autocomplete('springbok').all() # Expect 2 requests, and for results to be deduplicated assert len(results) == 25
def test_from_id(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/places/89191', json={'results': [j_place_1]}, status_code=200, ) result = iNatClient().places(89191) assert isinstance(result, Place) assert result.id == 89191
def test_client_auth(get_access_token): """An access token should be added to authenticated requests""" client = iNatClient() final_params_1 = client.request(request_function, auth=True) final_params_2 = client.request(request_function) assert final_params_1['access_token'] == 'token' assert 'access_token' not in final_params_2 get_access_token.assert_called_once()
def test_from_id(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/users/1', json=SAMPLE_DATA['get_user_by_id'], status_code=200, ) result = iNatClient().users(1) assert isinstance(result, User) assert result.id == 1
def test_autocomplete(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/taxa/autocomplete', json=SAMPLE_DATA['get_taxa_autocomplete'], status_code=200, ) results = iNatClient().taxa.autocomplete(q='vespi').all() assert len(results) == 10 and isinstance(results[0], Taxon) assert results[0].id == 52747
def test_from_id(requests_mock): project_id = 8291 requests_mock.get( f'{API_V1_BASE_URL}/projects/{project_id}', json={'results': [j_project_1]}, status_code=200, ) result = iNatClient().projects(project_id) assert isinstance(result, Project) assert result.id == project_id
def test_histogram(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/observations/histogram', json=SAMPLE_DATA['get_observation_histogram_day'], status_code=200, ) results = iNatClient().observations.histogram(user_id='username') assert len(results) == 31 assert results[datetime(2020, 1, 1, 0, 0)] == 11
def test_autocomplete(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/users/autocomplete', json=SAMPLE_DATA['get_users_autocomplete'], status_code=200, ) results = iNatClient().users.autocomplete(q='nico') assert len(results) == 3 and isinstance(results[0], User) assert results[0].id == 886482
def test_from_id(requests_mock): observation_id = 57754375 requests_mock.get( f'{API_V1_BASE_URL}/observations', json=SAMPLE_DATA['get_observations_node_page1'], status_code=200, ) result = iNatClient().observations(observation_id) assert isinstance(result, Observation) assert result.id == observation_id
def test_from_id__not_found(requests_mock): observation_id = 57754375 requests_mock.get( f'{API_V1_BASE_URL}/observations', json={ 'results': [], 'total_results': 0 }, status_code=200, ) assert iNatClient().observations(observation_id) is None
def test_from_id(requests_mock): taxon_id = 70118 requests_mock.get( f'{API_V1_BASE_URL}/taxa/{taxon_id}', json=SAMPLE_DATA['get_taxa_by_id'], status_code=200, ) result = iNatClient().taxa(taxon_id) assert isinstance(result, Taxon) assert result.id == taxon_id
def test_from_ids(requests_mock): taxon_id = 70118 requests_mock.get( f'{API_V1_BASE_URL}/taxa/{taxon_id}', json=SAMPLE_DATA['get_taxa_by_id'], status_code=200, ) results = iNatClient().taxa.from_ids(taxon_id).all() assert len(results) == 1 and isinstance(results[0], Taxon) assert results[0].id == taxon_id
def test_search(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/taxa', json=SAMPLE_DATA['get_taxa'], status_code=200, ) results = iNatClient().taxa.search(q='vespi', rank=['genus', 'subgenus', 'species']).all() assert len(results) == 30 and isinstance(results[0], Taxon) assert results[0].id == 70118
def test_autocomplete(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/places/autocomplete', json=SAMPLE_DATA['get_places_autocomplete'], status_code=200, ) place = iNatClient().places.autocomplete('springbok').one() assert place.id == 93735 assert place.name == 'Springbok' assert place.bbox_area == 0.000993854049 assert place.location == (-29.665119, 17.88583)
def test_identifiers(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/observations/identifiers', json=j_observation_identifiers, status_code=200, ) results = iNatClient().observations.identifiers(place_id=125323, iconic_taxa='Amphibia') assert len(results) == 3 and isinstance(results[0], User) assert results[0].id == 112514 assert results[0].login == 'earthstephen' assert results[0].count == 1
def test_popular_fields(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/observations/popular_field_values', json=SAMPLE_DATA['get_observation_popular_field_values'], status_code=200, ) client = iNatClient() results = client.observations.popular_fields( species_name='Danaus plexippus', place_id=24) assert results[0].count == 231 assert results[0].histogram[10] == 29 assert results[0].term.id == 1 assert results[0].value.label == 'Adult'
def test_taxon_summary__with_conservation_status(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/observations/89238647/taxon_summary', json=j_taxon_summary_1_conserved, status_code=200, ) client = iNatClient() results = client.observations.taxon_summary(89238647) assert isinstance(results, TaxonSummary) assert isinstance(results.conservation_status, ConservationStatus) assert results.conservation_status.taxon_id == 4747 assert results.conservation_status.status == 'NT'
def test_observers(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/observations/observers', json=j_observation_observers, status_code=200, ) results = iNatClient().observations.observers(place_id=125323, iconic_taxa='Amphibia') assert len(results) == 2 and isinstance(results[0], User) assert results[0].id == 53153 assert results[0].login == 'willkuhn' assert results[0].count == results[0].observation_count == 750 assert results[0].species_count == 1230
def test_life_list(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/observations/taxonomy', json=j_life_list, status_code=200, ) client = iNatClient() results = client.observations.life_list('username') assert isinstance(results, LifeList) assert results[0].id == 1 assert results[0].name == 'Animalia' assert results[0].direct_obs_count == 1 assert results[0].descendant_obs_count == results.get_count(1) == 3023
def test_species_counts(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/observations/species_counts', json=SAMPLE_DATA['get_observation_species_counts'], status_code=200, ) client = iNatClient() results = client.observations.species_counts(user_id='username') assert isinstance(results, TaxonCounts) assert results[0].rank == 'species' assert results[0].name == 'Harmonia axyridis' assert results[0].id == 48484 assert results[0].count == results.get_count(48484) == 31
def test_from_ids(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/users/1', json=SAMPLE_DATA['get_user_by_id'], status_code=200, ) requests_mock.get( f'{API_V1_BASE_URL}/users/2', json=SAMPLE_DATA['get_user_by_id'], status_code=200, ) results = iNatClient().users.from_ids(1, 2).all() assert len(results) == 2 and isinstance(results[0], User) assert results[0].id == 1
def test_search__with_obs_fields(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/projects', json={ 'results': [j_project_3_obs_fields], 'total_results': 1 }, status_code=200, ) results = iNatClient().projects.search(id=1234).all() obs_field = results[0].project_observation_fields[0] assert isinstance(obs_field, ProjectObservationField) assert obs_field.id == 30 assert obs_field.position == 0 assert obs_field.required is False
def test_from_ids(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/places/89191,67591', json={ 'results': [j_place_1, j_place_2], 'total_results': 2 }, status_code=200, ) results = iNatClient().places.from_ids(89191, 67591).all() place = results[0] assert len(results) == 2 and isinstance(place, Place) assert place.id == 89191 assert place.name == 'Conservation Area Riversdale' assert place.location == (-43.3254578926, 172.2325124165)
def test_nearby(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/places/nearby', json=SAMPLE_DATA['get_places_nearby'], status_code=200, ) results = iNatClient().places.nearby(150.0, -50.0, -149.999, -49.999).all() place = results[0] assert isinstance(place, Place) assert place.id == 97394 assert place.admin_level == -1 assert place.name == 'North America' assert place.category == 'standard' assert place.bbox_area == 28171.40875125 assert place.location == (56.7732555574, -179.68825) assert place.ancestor_place_ids == []
def test_search(requests_mock): requests_mock.get( f'{API_V1_BASE_URL}/observations', json=SAMPLE_DATA['get_observations_node_page1'], status_code=200, ) results = (iNatClient().observations.search(taxon_name='Danaus plexippus', created_on='2020-08-27').all()) assert isinstance(results[0], Observation) assert results[0].id == 57754375 assert results[0].taxon.id == 48662 assert results[0].created_at == datetime(2020, 8, 27, 18, 0, 51, tzinfo=tzutc())
def test_from_ids__limit(requests_mock): observation_id = 57754375 requests_mock.get( f'{API_V1_BASE_URL}/observations', [ { 'json': SAMPLE_DATA['get_observations_node_page1'], 'status_code': 200 }, { 'json': SAMPLE_DATA['get_observations_node_page2'], 'status_code': 200 }, ], ) results = iNatClient().observations.from_ids(observation_id).limit(1) assert len(results) == 1 and isinstance(results[0], Observation) assert results[0].id == observation_id