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
Пример #3
0
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
Пример #7
0
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()
Пример #8
0
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
Пример #11
0
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
Пример #12
0
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
Пример #13
0
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
Пример #14
0
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
Пример #15
0
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
Пример #16
0
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
Пример #17
0
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
Пример #18
0
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)
Пример #19
0
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
Пример #20
0
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'
Пример #21
0
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'
Пример #22
0
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
Пример #23
0
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
Пример #24
0
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
Пример #25
0
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
Пример #27
0
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)
Пример #28
0
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 == []
Пример #29
0
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())
Пример #30
0
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