"""
Module with tests for export.py
"""

# Copyright (c) IPython Development Team.
# Distributed under the terms of the Modified BSD License.

import os
import sys

import nbformat
import nbconvert.tests
import pytest

from traitlets.config import Config

from .base import ExportersTestsBase
from ..base import get_exporter, export, ExporterNameError, ExporterDisabledError, get_export_names
from ..exporter import Exporter
from ..python import PythonExporter


class TestExport(ExportersTestsBase):
    """Contains test functions for export.py"""


    def test_export_wrong_name(self):
        """
        Is the right error thrown when a bad template name is used?
        """
        try:
            exporter = get_exporter('not_a_name')
            export(exporter, self._get_notebook())
        except ExporterNameError as e:
            pass


    def test_export_disabled(self):
        """
        Trying to use a disabled exporter should raise ExporterDisbledError
        """
        config = Config({'NotebookExporter': {'enabled': False}})
        with pytest.raises(ExporterDisabledError):
            get_exporter('notebook', config=config)


    def test_export_filename(self):
        """
        Can a notebook be exported by filename?
        """
        exporter = get_exporter('python')
        (output, resources) = export(exporter, self._get_notebook())
        assert len(output) > 0


    def test_export_nbnode(self):
        """
        Can a notebook be exported by a notebook node handle?
        """
        with open(self._get_notebook(), 'r') as f:
            notebook = nbformat.read(f, 4)
            exporter = get_exporter('python')
            (output, resources) = export(exporter, notebook)
        assert len(output) > 0


    def test_export_filestream(self):
        """
        Can a notebook be exported by a filesteam?
        """
        with open(self._get_notebook(), 'r') as f:
            exporter = get_exporter('python')
            (output, resources) = export(exporter, f)
        assert len(output) > 0


    def test_export_using_exporter(self):
        """
        Can a notebook be exported using an instanciated exporter?
        """
        (output, resources) = export(PythonExporter(), self._get_notebook())
        assert len(output) > 0


    def test_export_using_exporter_class(self):
        """
        Can a notebook be exported using an exporter class type?
        """
        (output, resources) = export(PythonExporter, self._get_notebook())
        assert len(output) > 0


    def test_export_resources(self):
        """
        Can a notebook be exported along with a custom resources dict?
        """
        (output, resources) = export(PythonExporter, self._get_notebook(), resources={})
        assert len(output) > 0


    def test_no_exporter(self):
        """
        Is the right error thrown if no exporter is provided?
        """
        try:
            (output, resources) = export(None, self._get_notebook())
        except TypeError:
            pass

def test_get_exporter_entrypoint():
    p = os.path.join(os.path.dirname(nbconvert.tests.__file__), 'exporter_entrypoint')
    sys.path.insert(0, p)
    assert 'entrypoint_test' in get_export_names()
    try:
        cls = get_exporter('entrypoint_test')
        assert issubclass(cls, Exporter), cls
    finally:
        del sys.path[0]
