File size: 2,314 Bytes
c1e08a0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import warnings
from unittest.mock import Mock, patch

import gradio as gr
import pytest

from improvisation_lab.presentation.melody_practice.web_melody_view import \
    WebMelodyView


class TestWebMelodyView:

    @pytest.fixture
    def init_module(self):
        self.start_callback = Mock(return_value=("Phrase Info", "Note Status"))
        self.stop_callback = Mock(return_value=("Session Stopped", "Practice ended"))
        self.audio_callback = Mock(
            return_value=("Audio Phrase Info", "Audio Note Status")
        )
        self.web_view = WebMelodyView(
            on_generate_melody=self.start_callback,
            on_end_practice=self.stop_callback,
            on_audio_input=self.audio_callback,
            song_name="Test Song",
        )

    @pytest.mark.usefixtures("init_module")
    def test_build_interface(self):
        warnings.simplefilter("ignore", category=DeprecationWarning)
        app = self.web_view._build_interface()
        assert isinstance(app, gr.Blocks)

    @pytest.mark.usefixtures("init_module")
    @patch("gradio.Markdown")
    def test_create_header(self, mock_markdown):
        self.web_view._add_header()
        mock_markdown.assert_called_once_with(
            "# Test Song Melody Practice\nSing each note for 1 second!"
        )

    @pytest.mark.usefixtures("init_module")
    def test_create_status_section(self):
        self.web_view._build_interface()
        assert isinstance(self.web_view.phrase_info_box, gr.Textbox)
        assert isinstance(self.web_view.pitch_result_box, gr.Textbox)

    @pytest.mark.usefixtures("init_module")
    def test_create_control_buttons(self):
        self.web_view._build_interface()
        self.web_view.on_generate_melody()
        self.start_callback.assert_called_once()
        self.web_view.on_end_practice()
        self.stop_callback.assert_called_once()

    @pytest.mark.usefixtures("init_module")
    def test_create_audio_input(self):
        self.web_view._build_interface()
        self.web_view.on_audio_input()
        self.audio_callback.assert_called_once()

    @pytest.mark.usefixtures("init_module")
    def test_launch(self, mocker):
        mocker.patch.object(gr.Blocks, "launch", return_value=None)
        self.web_view.launch()
        gr.Blocks.launch.assert_called_once()