# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import json

from cirrus import CirrusClient, NimbusError
from conftest import TestMetricsHandler


def test_one_experiment_should_enroll(client, req):
    response = json.loads(client.handle_enrollment(req()))

    assert len(response["enrollments"]) == 1
    assert "Enrolled" in response["enrollments"][0]["status"].keys()
    assert len(list(response["enrolledFeatureConfigMap"].values())) == 1
    assert len(response["events"]) == 1


def test_one_experiment_should_not_enroll(client, req, request_context):
    request_context["username"] = "not test"

    request = req(request_context=request_context)

    response = json.loads(client.handle_enrollment(request))

    assert len(response["enrollments"]) == 1
    assert "NotEnrolled" in response["enrollments"][0]["status"].keys()
    assert len(list(response["enrolledFeatureConfigMap"].values())) == 0
    assert len(response["events"]) == 0


def test_one_experiment_should_enroll_1000_times(client, req):
    response = None
    for i in range(0, 1000):
        response = json.loads(client.handle_enrollment(req()))

    assert len(response["enrollments"]) == 1
    assert "Enrolled" in response["enrollments"][0]["status"].keys()
    assert len(list(response["enrolledFeatureConfigMap"].values())) == 1
    assert len(response["events"]) == 1


def test_failure_case_no_client_id(client, req):
    request = req(client_id=None)

    try:
        client.handle_enrollment(request)
    except NimbusError:
        pass
    else:
        assert False, "client.handle_enrollment did not throw an error"


def test_metrics_handler(app_context, experiment, req):
    test_metrics = TestMetricsHandler()
    client = CirrusClient(app_context, test_metrics, [])
    data = json.dumps({"data": [experiment]})
    client.set_experiments(data)

    json.loads(client.handle_enrollment(req()))

    assert len(test_metrics.recordings) == 1
    assert test_metrics.nimbus_user_id
