import flask
import json
import pytest
from unittest.mock import patch, mock_open, call
from werkzeug.exceptions import HTTPException
from api import create_app


@pytest.mark.usefixtures("mock_clients", "mock_client_credentials")
def test_get_token(mock_clients, mock_client_credentials):
    app = create_app()
    with patch(
        "builtins.open", mock_open(read_data=json.dumps(mock_clients))
    ) as mock_file_open, app.test_client() as app_test_client:
        response = app_test_client.get("/token", query_string=mock_client_credentials)
        assert response.status_code == 200
        assert "token" in response.json


@pytest.mark.usefixtures("mock_clients", "mock_invalid_credentials")
def test_get_token_invalid_credentials(mock_clients, mock_invalid_credentials):
    app = create_app()
    with patch(
        "builtins.open", mock_open(read_data=json.dumps(mock_clients))
    ) as mock_file_open, app.test_client() as app_test_client:
        response = app_test_client.get("/token", query_string=mock_invalid_credentials)
        assert response.status_code == 403
        assert "token" not in response.json


@pytest.mark.usefixtures("mock_clients", "mock_client_credentials")
def test_get_token_no_credentials(mock_clients, mock_client_credentials):
    app = create_app()
    with patch(
        "builtins.open", mock_open(read_data=json.dumps(mock_clients))
    ) as mock_file_open, app.test_client() as app_test_client:
        response = app_test_client.get("/token")
        assert response.status_code == 400
        assert "token" not in response.json