#!/usr/bin/env python
from pathlib import Path
from unittest import mock

import mozunit
import pytest

from mozperftest.metrics.notebook.constant import Constant


def test_init(ptnb, standarized_data):
    assert isinstance(ptnb.data, dict)
    assert isinstance(ptnb.const, Constant)


def test_get_notebook_section(ptnb):
    func = "scatterplot"
    with (ptnb.const.here / "notebook-sections" / func).open() as f:
        assert ptnb.get_notebook_section(func) == f.read()


def test_get_notebook_section_unknown_analysis(ptnb):
    func = "unknown"
    assert ptnb.get_notebook_section(func) == ""


@pytest.mark.parametrize("analysis", [["scatterplot"], None])
def test_post_to_iodide(ptnb, standarized_data, analysis):

    opener = mock.mock_open()

    def mocked_open(self, *args, **kwargs):
        return opener(self, *args, **kwargs)

    with mock.patch.object(Path, "open", mocked_open), mock.patch(
        "mozperftest.metrics.notebook.perftestnotebook.webbrowser.open_new_tab"
    ) as browser, mock.patch(
        "mozperftest.metrics.notebook.perftestnotebook.HTTPServer"
    ) as server:
        ptnb.post_to_iodide(analysis=analysis)

        list_of_calls = opener.mock_calls

        header_path = ptnb.const.here / "notebook-sections" / "header"
        assert mock.call(header_path) in list_of_calls
        index1 = list_of_calls.index(mock.call(header_path))
        assert list_of_calls[index1 + 2] == mock.call().read()

        template_upload_file_path = ptnb.const.here / "template_upload_file.html"
        assert mock.call(template_upload_file_path) in list_of_calls
        index2 = list_of_calls.index(mock.call(template_upload_file_path))
        assert list_of_calls[index2 + 2] == mock.call().read()

        upload_file_path = ptnb.const.here / "upload_file.html"
        assert mock.call(upload_file_path, "w") in list_of_calls
        index3 = list_of_calls.index(mock.call(upload_file_path, "w"))
        assert list_of_calls[index3 + 2] == mock.call().write("")

        assert index1 < index2 < index3

        if analysis:
            section_path = ptnb.const.here / "notebook-sections" / analysis[0]
            assert mock.call(section_path) in list_of_calls
            index4 = list_of_calls.index(mock.call(section_path))
            assert index1 < index4 < index2
        else:
            assert list_of_calls.count(mock.call().__enter__()) == 3

        browser.assert_called_with(str(upload_file_path))
        server.assert_has_calls(
            [mock.call().serve_forever(), mock.call().server_close()]
        )


if __name__ == "__main__":
    mozunit.main()
