class ProgramTest(unittest.TestCase):
    def setUp(self):
        phonebook = MagicMock()
        phonebook.records = []
        self.program = Program(phonebook)
        self.program._read = MagicMock(return_value="")
        self.program._write = MagicMock()

    def test_menu__should__exists(self):
        assert hasattr(self.program, "menu")

    def test_run__should__exist(self):
        hasattr(self.program, "run")
        self.program.run()

    def test_run__should__show_menu_and_wait_for_input(self):
        expectedText = self.program.menu

        self.program.run()

        self.program._write.assert_called_once_with(expectedText)

        self.program._read.assert_called_once_with()

    def test_get_list__should__exists(self):
        assert hasattr(self.program, "getList")

    def test_get_list__should__return_a_list(self):
        entries = self.program.getList()
        self.assertIsNotNone(entries)
        self.assertIsInstance(entries, list)
        # assert hasattr(phonebook, "__iter__"); # is iterable

    def test_getList__when__an_entry_is_added__should__return_a_list_with(
            self):

        # Arrange
        entry = Helper.getTestEntry()

        phonebook = Phonebook(Helper.filename)
        phonebook.records = MagicMock(return_value=[entry])
        program = Program(Helper.filename)

        # Act
        entries = self.program.getList()

        # Assert
        Helper.assertPhonebookContainsEntry(phonebook, entry)

    def test_showList__should__call_getList(self):
        program = Program(Helper.filename)
        list = []

        with patch.object(self.program, "getList",
                          return_value=list) as mock_getList:
            # Act
            self.program.showList()

        mock_getList.assert_called_once_with()
class ProgramTest (unittest.TestCase):

    def setUp(self):
        phonebook = MagicMock()
        phonebook.records = []
        self.program = Program(phonebook)
        self.program._read = MagicMock(return_value="")
        self.program._write = MagicMock()

    def test_menu__should__exists(self):
        assert hasattr(self.program, "menu")

    def test_run__should__exist(self):
        hasattr(self.program, "run")
        self.program.run()

    def test_run__should__show_menu_and_wait_for_input(self):
        expectedText = self.program.menu

        self.program.run()

        self.program._write.assert_called_once_with(expectedText)

        self.program._read.assert_called_once_with()

    def test_get_list__should__exists(self):
        assert hasattr(self.program, "getList")

    def test_get_list__should__return_a_list(self):
        entries = self.program.getList()
        self.assertIsNotNone(entries)
        self.assertIsInstance(entries, list)
        #assert hasattr(phonebook, "__iter__"); # is iterable

    def test_getList__when__an_entry_is_added__should__return_a_list_with(self):

        # Arrange
        entry = Helper.getTestEntry()

        phonebook = Phonebook(Helper.filename)
        phonebook.records = MagicMock(return_value=[entry])
        program = Program(Helper.filename)

        # Act
        entries = self.program.getList()

        # Assert
        Helper.assertPhonebookContainsEntry(phonebook, entry)