1import pytest
2from unittest.mock import patch, MagicMock
3
4from UM.FileHandler.FileHandler import FileHandler
5
6
7@pytest.fixture
8def file_handler(application):
9    FileHandler._FileHandler__instance = None
10    with patch("UM.FileHandler.FileHandler.PluginRegistry.addType"):
11        handler = FileHandler(application, writer_type= "test_writer", reader_type= "test_reader")
12    return handler
13
14@pytest.fixture
15def file_writer():
16    mocked_writer = MagicMock()
17    mocked_writer.getPluginId = MagicMock(return_value="beep")
18    return mocked_writer
19
20
21def test_getSupportedFileTypesRead(file_handler):
22    registry = MagicMock()
23    registry.getAllMetaData = MagicMock(return_value = [{"test_reader": [{"extension":".test"}]}])
24    with patch("UM.PluginRegistry.PluginRegistry.getInstance", MagicMock(return_value = registry)):
25        assert file_handler.getSupportedFileTypesRead() == {".test": ".test"}
26
27
28def test_getSupportedFileTypesWrite(file_handler):
29    registry = MagicMock()
30    registry.getAllMetaData = MagicMock(return_value=[{"id":"beep", "test_writer":{ "output": [{ "extension": ".test", "mime_type": "test/test"}] }}])
31    with patch("UM.PluginRegistry.PluginRegistry.getInstance", MagicMock(return_value=registry)):
32        assert file_handler.getSupportedFileTypesWrite() == [{'id': 'beep', 'extension': '.test', 'description': '.test', 'mime_type': 'test/test', 'mode': 1, 'hide_in_file_dialog': False}]
33
34
35def test_getWriterByMimeType_KnownMimeType(file_handler, file_writer):
36    file_handler.addWriter(file_writer)
37    registry = MagicMock()
38    registry.getAllMetaData = MagicMock(return_value=[{"id": "beep", "test_writer": {"output": [{"extension": ".test", "mime_type": "test/test"}]}}])
39    with patch("UM.PluginRegistry.PluginRegistry.getInstance", MagicMock(return_value=registry)):
40        assert file_handler.getWriterByMimeType("test/test") == file_writer
41
42
43def test_getWriterByMimeType_UnknownMimeType(file_handler, file_writer):
44    file_handler.addWriter(file_writer)
45    registry = MagicMock()
46    registry.getAllMetaData = MagicMock(return_value=[])
47    with patch("UM.PluginRegistry.PluginRegistry.getInstance", MagicMock(return_value=registry)):
48        assert file_handler.getWriterByMimeType("test/test") is None
49
50
51def test_getWriter_KnownWriter(file_handler, file_writer):
52    file_handler.addWriter(file_writer)
53    assert file_handler.getWriter("beep") == file_writer
54
55
56def test_getWriter_UnknownWriter(file_handler):
57    # We never added a writer, so we should get None
58    assert file_handler.getWriter("beep") is None
59
60
61def test_getReaderForFile(file_handler):
62    mocked_reader = MagicMock()
63    mocked_reader.acceptsFile = MagicMock(return_value = True)
64    file_handler.addReader(mocked_reader)
65
66    assert file_handler.getReaderForFile("whatever") is mocked_reader
67
68
69def test_getReaderForFileWithException(file_handler):
70    mocked_reader = MagicMock()
71    mocked_reader.acceptsFile = MagicMock(side_effect=Exception)
72    file_handler.addReader(mocked_reader)
73
74    # As file readers are plugins, we ensure that any exceptions are handled and dropped so they don't crash the
75    # application
76    assert file_handler.getReaderForFile("whatever") is None
77