def test_saveStoredSearch_should_limit_search_collection_before_calling_store(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = [
            "some_search4",
            "some_search2",
            "some_search3",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
        ]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({"search": "some_search1", "old_search": "some_search2"})

        assert len(storage.storeSettings.call_args[0][1]) == 10
        storage.storeSettings.assert_called_with(
            {"search": "some_search1", "old_search": "some_search2"},
            ["some_search1", "some_search4", "some_search3", "", "", "", "", "", "", ""],
        )
    def test_deleteStoredSearch_should_remove_search_from_list_before_calling_store(self):
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.deleteStoredSearch({"delete": "some_search2"})

        storage.storeSettings.assert_called_with({"delete": "some_search2"}, [])
    def test_getStoredSearches_should_call_retrieve_to_get_searches(self):
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search"]
        storage.storeSettings = Mock()

        storage.getStoredSearches({"path": "some_path"})

        assert storage.retrieveSettings.call_count > 0
    def test_deleteStoredSearch_should_call_executebuiltin(self):
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.deleteStoredSearch({"delete": "some_search2"})

        sys.modules["__main__"].xbmc.executebuiltin.assert_called_with("Container.Refresh")
    def test_saveStoredSearch_should_exit_cleanly_if_search_is_not_in_params(self):
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({})

        assert storage.retrieve.call_count == 0
        assert storage.storeSettings.call_count == 0
    def test_saveStoredSearch_should_call_getSettings_to_get_max_searches_count(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({"search": "some_search1", "old_search": "some_search2"})

        sys.modules["__main__"].settings.getSetting.assert_called_with("saved_searches")
    def test_deleteStoredSearch_should_call_retrieve_to_get_searches(self):
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search1"]
        storage.storeSettings = Mock()

        storage.deleteStoredSearch({"delete": "some_search2"})

        storage.retrieveSettings.assert_called_with({"delete": "some_search2"})
        assert storage.retrieveSettings.call_count == 1
    def test_saveStoredSearch_should_call_store_to_save_searches_collection(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({"search": "some_search1", "old_search": "some_search2"})

        assert storage.storeSettings.call_count > 0
    def test_editStoredSearch_should_exit_cleanly_if_search_param_is_missing(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules["__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.editStoredSearch({})

        assert storage.storeSettings.call_count == 0
        assert storage.retrieve.call_count == 0
    def test_editStoredSearch_should_ask_user_for_new_search_phrase(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules["__main__"].language.return_value = "some_title"
        sys.modules["__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.editStoredSearch({"search": "some_search1"})

        sys.modules["__main__"].common.getUserInput.assert_called_with("some_title", "some_search1")
    def test_getStoredSearches_should_return_proper_list_structure(self):
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search"]
        storage.storeSettings = Mock()

        (result, status) = storage.getStoredSearches({"path": "some_path"})

        print repr(result)
        assert result == [
            {"path": "some_path", "search": "some_search", "thumbnail": ["some_search"], "Title": "some_search"}
        ]
    def test_saveStoredSearch_should_remove_old_search_from_collection_and_prepend_new_search(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search4", "some_search2", "some_search3"]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({"search": "some_search1", "old_search": "some_search2"})

        storage.storeSettings.assert_called_with(
            {"search": "some_search1", "old_search": "some_search2"}, ["some_search1", "some_search4", "some_search3"]
        )
    def test_editStoredSearch_should_set_store_to_disco_if_editing_disco_searches(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules["__main__"].language.return_value = "some_title"
        sys.modules["__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.editStoredSearch({"search": "some_search1", "action": "edit_disco"})

        assert storage.storeSettings.call_args[0][0].has_key("scraper")
    def test_editStoredSearch_should_call_saveStoredSearch(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules["__main__"].language.return_value = "some_title"
        sys.modules["__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search2"]
        storage.storeSettings = Mock()
        storage.saveStoredSearch = Mock()

        storage.editStoredSearch({"search": "some_search1", "action": "edit_disco"})

        storage.saveStoredSearch.assert_called_with({"search": "some_search3", "scraper": "search_disco"})
    def test_editStoredSearch_should_exit_cleanly_if_search_param_is_missing(
            self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules[
            "__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.editStoredSearch({})

        assert (storage.storeSettings.call_count == 0)
        assert (storage.retrieve.call_count == 0)
    def test_saveStoredSearch_should_call_store_to_save_searches_collection(
            self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({
            "search": "some_search1",
            "old_search": "some_search2"
        })

        assert (storage.storeSettings.call_count > 0)
    def test_editStoredSearch_should_ask_user_for_new_search_phrase(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules["__main__"].language.return_value = "some_title"
        sys.modules[
            "__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.editStoredSearch({"search": "some_search1"})

        sys.modules["__main__"].common.getUserInput.assert_called_with(
            'some_title', 'some_search1')
    def test_editStoredSearch_should_set_store_to_searches_if_editing_searches(
            self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules["__main__"].language.return_value = "some_title"
        sys.modules[
            "__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.editStoredSearch({"search": "some_search1"})

        assert (storage.storeSettings.call_args[0][0].has_key("feed"))
    def test_editStoredSearch_should_remove_old_search_param_before_exiting(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules["__main__"].language.return_value = "some_title"
        sys.modules["__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search2"]
        storage.storeSettings = Mock()
        storage.saveStoredSearch = Mock()
        params = {"search": "some_search1", "action": "edit_disco", "old_search": "some_search4"}

        storage.editStoredSearch(params)

        assert params.has_key("old_search") == False
    def test_getStoredSearches_should_return_proper_list_structure(self):
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search"]
        storage.storeSettings = Mock()

        (result, status) = storage.getStoredSearches({"path": "some_path"})

        print repr(result)
        assert (result == [{
            'path': 'some_path',
            'search': 'some_search',
            'thumbnail': ['some_search'],
            'Title': 'some_search'
        }])
    def test_saveStoredSearch_should_call_getSettings_to_get_max_searches_count(
            self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search2"]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({
            "search": "some_search1",
            "old_search": "some_search2"
        })

        sys.modules["__main__"].settings.getSetting.assert_called_with(
            "saved_searches")
    def test_deleteStoredSearch_should_call_unquote_on_delete_param(self):
        patcher = patch("urllib.unquote_plus")
        patcher.start()
        import urllib
        urllib.unquote_plus.return_value = "some_unquoted_search"
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search1"]
        storage.storeSettings = Mock()

        storage.deleteStoredSearch({"delete": "some_search2"})
        args = urllib.unquote_plus.call_args
        patcher.stop()

        assert (args[0][0] == "some_search2")
    def test_deleteStoredSearch_should_call_unquote_on_delete_param(self):
        patcher = patch("urllib.unquote_plus")
        patcher.start()
        import urllib

        urllib.unquote_plus.return_value = "some_unquoted_search"
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search1"]
        storage.storeSettings = Mock()

        storage.deleteStoredSearch({"delete": "some_search2"})
        args = urllib.unquote_plus.call_args
        patcher.stop()

        assert args[0][0] == "some_search2"
    def test_saveStoredSearch_should_call_unquote_on_search_param(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        patcher = patch("urllib.unquote_plus")
        patcher.start()
        import urllib
        urllib.unquote_plus.return_value = "some_unquoted_search"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search1"]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({"search": "some_search"})

        args = urllib.unquote_plus.call_args
        patcher.stop()

        assert (args[0][0] == "some_search")
    def test_getStoredSearches_should_call_retrieve_to_get_thumbnail_collection(self):
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search"]
        storage.storeSettings = Mock()

        storage.getStoredSearches({"path": "some_path"})

        assert storage.retrieveSettings.call_args[0][0] == {"path": "some_path"}
        assert storage.retrieveSettings.call_args[0][1] == "thumbnail"
        assert storage.retrieveSettings.call_args[0][2] == {
            "path": "some_path",
            "search": "some_search",
            "thumbnail": ["some_search"],
            "Title": "some_search",
        }
        assert storage.retrieveSettings.call_count == 2
    def test_saveStoredSearch_should_call_unquote_on_search_param(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        patcher = patch("urllib.unquote_plus")
        patcher.start()
        import urllib

        urllib.unquote_plus.return_value = "some_unquoted_search"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search1"]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({"search": "some_search"})

        args = urllib.unquote_plus.call_args
        patcher.stop()

        assert args[0][0] == "some_search"
    def test_getStoredSearches_should_call_quote_plus_on_search_items(self):
        patcher = patch("urllib.quote_plus")
        patcher.start()
        import urllib

        urllib.quote_plus.return_value = "some_quoted_search"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search"]
        storage.storeSettings = Mock()

        (result, status) = storage.getStoredSearches({"path": "some_path"})
        args = urllib.quote_plus.call_args
        patcher.stop()

        assert args[0][0] == "some_search"
        assert result == [
            {"path": "some_path", "search": "some_quoted_search", "thumbnail": ["some_search"], "Title": "some_search"}
        ]
    def test_saveStoredSearch_should_remove_old_search_from_collection_and_prepend_new_search(
            self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = [
            "some_search4", "some_search2", "some_search3"
        ]
        storage.storeSettings = Mock()

        storage.saveStoredSearch({
            "search": "some_search1",
            "old_search": "some_search2"
        })

        storage.storeSettings.assert_called_with(
            {
                "search": "some_search1",
                "old_search": "some_search2"
            }, ['some_search1', 'some_search4', 'some_search3'])
    def test_editStoredSearch_should_call_saveStoredSearch(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules["__main__"].language.return_value = "some_title"
        sys.modules[
            "__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search2"]
        storage.storeSettings = Mock()
        storage.saveStoredSearch = Mock()

        storage.editStoredSearch({
            "search": "some_search1",
            "action": "edit_disco"
        })

        storage.saveStoredSearch.assert_called_with({
            'search': 'some_search3',
            'scraper': 'search_disco'
        })
    def test_editStoredSearch_should_set_search_params_before_exiting(self):
        sys.modules["__main__"].settings.getSetting.return_value = "0"
        sys.modules["__main__"].language.return_value = "some_title"
        sys.modules[
            "__main__"].common.getUserInput.return_value = "some_search3"
        storage = YouTubeStorage()
        storage.retrieve = Mock()
        storage.retrieve.return_value = ["some_search2"]
        storage.storeSettings = Mock()
        storage.saveStoredSearch = Mock()
        params = {
            "search": "some_search1",
            "action": "edit_disco",
            "old_search": "some_search4"
        }

        storage.editStoredSearch(params)

        assert (params.has_key("search"))
        assert (params["search"] == "some_search3")
    def test_getStoredSearches_should_call_retrieve_to_get_thumbnail_collection(
            self):
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search"]
        storage.storeSettings = Mock()

        storage.getStoredSearches({"path": "some_path"})

        assert (storage.retrieveSettings.call_args[0][0] == {
            "path": "some_path"
        })
        assert (storage.retrieveSettings.call_args[0][1] == "thumbnail")
        assert (storage.retrieveSettings.call_args[0][2] == {
            'path': 'some_path',
            'search': 'some_search',
            'thumbnail': ['some_search'],
            'Title': 'some_search'
        })
        assert (storage.retrieveSettings.call_count == 2)
    def test_getStoredSearches_should_call_quote_plus_on_search_items(self):
        patcher = patch("urllib.quote_plus")
        patcher.start()
        import urllib
        urllib.quote_plus.return_value = "some_quoted_search"
        storage = YouTubeStorage()
        storage.retrieveSettings = Mock()
        storage.retrieveSettings.return_value = ["some_search"]
        storage.storeSettings = Mock()

        (result, status) = storage.getStoredSearches({"path": "some_path"})
        args = urllib.quote_plus.call_args
        patcher.stop()

        assert (args[0][0] == "some_search")
        assert (result == [{
            'path': 'some_path',
            'search': 'some_quoted_search',
            'thumbnail': ['some_search'],
            'Title': 'some_search'
        }])