laboiteproject/lenuage

View on GitHub
laboite/apps/bikes/tests.py

Summary

Maintainability
F
5 days
Test Coverage
# coding: utf-8
from datetime import timedelta
from operator import itemgetter

from django.utils import timezone
import pytest

from .models import AppBikes
from .providers import get_provider

PAST = timezone.now() - timedelta(seconds=AppBikes.UPDATE_INTERVAL + 1)

STAR_SEARCH_RESULTS = '''{"nhits": 2, "parameters": {"dataset": ["vls-stations-etat-tr"], "timezone": "Europe/Paris", "q": "nom:place", "rows": 10, "sort": "nom", "format": "json", "fields": ["idstation", "nom"]}, "records": [{"datasetid": "vls-stations-etat-tr", "recordid": "03bd9f7320deca7e70c171d1a1a14224c446698b", "fields": {"idstation": 24, "nom": "Place de Bretagne"}, "record_timestamp": "2016-10-21T12:22:00+02:00"}, {"datasetid": "vls-stations-etat-tr", "recordid": "b4619d5f34e51da488f9fb19ebb8e88020d78df0", "fields": {"idstation": 4, "nom": "Place Hoche"}, "record_timestamp": "2016-10-21T12:22:00+02:00"}]}'''  # noqa
STAR_STATION_INFOS = '''{"nhits": 1, "parameters": {"dataset": ["vls-stations-etat-tr"], "timezone": "Europe/Paris", "q": "idstation:4", "rows": 10, "format": "json", "fields": ["nom", "nombreemplacementsactuels", "nombrevelosdisponibles", "etat"]}, "records": [{"datasetid": "vls-stations-etat-tr", "recordid": "b4619d5f34e51da488f9fb19ebb8e88020d78df0", "fields": {"etat": "En fonctionnement", "nom": "Place Hoche", "nombrevelosdisponibles": 18, "nombreemplacementsactuels": 24}, "record_timestamp": "2016-10-21T12:23:00+02:00"}]}'''  # noqa
VELIB_SEARCH_RESULTS = '''{"nhits": 2, "parameters": {"dataset": ["stations-velib-disponibilites-en-temps-reel"], "timezone": "UTC", "q": "metro", "rows": 10, "format": "json", "fields": ["number", "name"]}, "records": [{"datasetid": "stations-velib-disponibilites-en-temps-reel", "recordid": "581a0aa68a4f7878ec806ea8308651c685af1c69", "fields": {"name": "08020 - METRO ROME", "number": 8020}}, {"datasetid": "stations-velib-disponibilites-en-temps-reel", "recordid": "8a856279aa389e032b5495c8de11e624423ee35c", "fields": {"name": "22401 - DE GAULLE (MALAKOFF)", "number": 22401}}]}'''  # noqa
VELIB_STATION_INFOS = '''{"nhits": 1, "parameters": {"dataset": ["stations-velib-disponibilites-en-temps-reel"], "timezone": "UTC", "q": "number:8020", "rows": 10, "format": "json", "fields": ["name", "bike_stands", "available_bikes", "status"]}, "records": [{"datasetid": "stations-velib-disponibilites-en-temps-reel", "recordid": "581a0aa68a4f7878ec806ea8308651c685af1c69", "fields": {"status": "OPEN", "bike_stands": 44, "available_bikes": 7, "name": "08020 - METRO ROME"}}]}'''  # noqa


@pytest.fixture
def app(boite):
    return AppBikes.objects.create(boite=boite,
                                   created_date=PAST - timedelta(minutes=10),
                                   last_activity=PAST,
                                   enabled=True)


def _get_stations(provider_name):
    provider = get_provider(provider_name)
    return provider.get_stations('whatever')


def _get_station_infos(provider_name):
    provider = get_provider(provider_name)
    return provider.get_station_infos('whatever')


# Common
@pytest.mark.django_db
def test_not_enabled(app, requests_mocker, settings):
    app.enabled = False
    app.save()
    with requests_mocker as m:
        m.get(settings.STAR_API_BASE_URL, status_code=500, text='')
        assert app.get_app_dictionary() is None


# Star
def test_search_results_ok_star(requests_mocker, settings):
    with requests_mocker as m:
        m.get(settings.STAR_API_BASE_URL, text=STAR_SEARCH_RESULTS)
        assert _get_stations('star') == [(24, 'Place de Bretagne'),
                                         (4, 'Place Hoche')]


def test_search_results_ko_star(requests_mocker, settings):
    with requests_mocker as m:
        m.get(settings.STAR_API_BASE_URL, status_code=500, text='')
        assert len(_get_stations('star')) == 0


@pytest.mark.django_db
def test_station_infos_ok_star(app, requests_mocker, settings):
    app.provider = 'star'
    app.save()
    with requests_mocker as m:
        m.get(settings.STAR_API_BASE_URL, text=STAR_STATION_INFOS)
        result = app.get_app_dictionary()
        assert len(result) == 3
        assert result['height'] == 10
        assert result['width'] == 32
        result['data'].sort(key=itemgetter('type'))
        assert len(result['data']) == 2
        expected_data = [
            {'color': 3,
             'content': '0x00c1c208c0f878eab9bd589170e',
             'height': 10,
             'type': 'bitmap',
             'width': 12,
             'x': 5,
             'y': 1},
            {'color': 2,
             'font': 1,
             'content': '18',
             'height': 10,
             'type': 'text',
             'width': 10,
             'x': 18,
             'y': 3}
        ]
        assert result['data'] == expected_data


@pytest.mark.django_db
def test_station_infos_ko_star(app, requests_mocker, settings):
    app.provider = 'star'
    app.save()
    with requests_mocker as m:
        m.get(settings.STAR_API_BASE_URL, status_code=500, text='')
        assert app.get_app_dictionary() is None


# Velib
def test_search_results_ok_velib(requests_mocker, settings):
    with requests_mocker as m:
        m.get(settings.VELIB_API_BASE_URL, text=VELIB_SEARCH_RESULTS)
        assert _get_stations('velib') == [(8020, '08020 - METRO ROME'),
                                          (22401, '22401 - DE GAULLE (MALAKOFF)')]


def test_search_results_ko_velib(requests_mocker, settings):
    with requests_mocker as m:
        m.get(settings.VELIB_API_BASE_URL, status_code=500, text='')
        assert len(_get_stations('velib')) == 0


@pytest.mark.django_db
def test_station_infos_ok_velib(app, requests_mocker, settings):
    app.provider = 'velib'
    app.save()
    with requests_mocker as m:
        m.get(settings.VELIB_API_BASE_URL, text=VELIB_STATION_INFOS)
        result = app.get_app_dictionary()
        assert len(result) == 3
        assert result['height'] == 10
        assert result['width'] == 32
        result['data'].sort(key=itemgetter('type'))
        assert len(result['data']) == 2
        expected_data = [
            {'color': 3,
             'content': '0x00c1c208c0f878eab9bd589170e',
             'height': 10,
             'type': 'bitmap',
             'width': 12,
             'x': 5,
             'y': 1},
            {'color': 2,
             'font': 1,
             'content': '7',
             'height': 10,
             'type': 'text',
             'width': 10,
             'x': 18,
             'y': 3}
        ]
        assert result['data'] == expected_data


@pytest.mark.django_db
def test_station_infos_ko_velib(app, requests_mocker, settings):
    app.provider = 'velib'
    app.save()
    with requests_mocker as m:
        m.get(settings.VELIB_API_BASE_URL, status_code=500, text='')
        assert app.get_app_dictionary() is None