import pytest
from app import app

ROUTE = '/dice'


@pytest.fixture
def app_instance():
    """Create and configure a new test client instance."""
    app_instance = app
    app.config['TESTING'] = True
    return app_instance


def test_roll_dice_success(app_instance):
    with app.test_client() as client:
        # successful request
        response = client.get(ROUTE,
                              query_string={'quantity': '3', 'geometry': '6',
                                            'discard_lowest': 'false'})
        assert response.status_code == 200


def test_quantity_out_of_range_low(app_instance):
    with app.test_client() as client:
        response = client.get(ROUTE, query_string={'quantity': '0',
                                                   'geometry': '6', 'discard_lowest': 'false'})
        assert response.status_code == 400


def test_quantity_out_of_range_high(app_instance):
    with app.test_client() as client:
        response = client.get(ROUTE, query_string={'quantity': '101',
                                                   'geometry': '6', 'discard_lowest': 'false'})
        assert response.status_code == 400


def test_geometry_out_of_range_low(app_instance):
    with app.test_client() as client:
        # geometry out of range
        response = client.get(ROUTE, query_string={'quantity': '3',
                                                   'geometry': '2', 'discard_lowest': 'false'})
        assert response.status_code == 400


def test_geometry_out_of_range_high(app_instance):
    with app.test_client() as client:
        response = client.get(ROUTE, query_string={'quantity': '3',
                                                   'geometry': '101', 'discard_lowest': 'false'})
        assert response.status_code == 400


def test_discard_lowest_success(app_instance):
    with app.test_client() as client:
        # test discard_lowest
        response = client.get(ROUTE, query_string={'quantity': '3',
                                                   'geometry': '6', 'discard_lowest': 'true'})
        assert response.status_code == 200
