# SPDX-License-Identifier: AGPL-3.0-or-later
"""
Functional, browser based tests for transmission app.
"""

import os

import pytest
from plinth.tests import functional

pytestmark = [pytest.mark.apps, pytest.mark.transmission, pytest.mark.sso]


class TestTransmissionApp(functional.BaseAppTests):
    app_name = 'transmission'
    has_service = False
    has_web = True

    def test_upload_torrent(self, session_browser):
        """Test uploading a torrent to Transmission."""
        functional.app_enable(session_browser, 'transmission')
        _remove_all_torrents(session_browser)
        _upload_sample_torrent(session_browser)
        _assert_number_of_torrents(session_browser, 1)

    @pytest.mark.backups
    def test_backup_restore(self, session_browser):
        """Test backup and restore of app data."""
        functional.app_enable(session_browser, 'transmission')
        _remove_all_torrents(session_browser)
        _upload_sample_torrent(session_browser)
        functional.backup_create(session_browser, 'transmission',
                                 'test_transmission')

        _remove_all_torrents(session_browser)
        functional.backup_restore(session_browser, 'transmission',
                                  'test_transmission')

        assert functional.service_is_running(session_browser, 'transmission')
        _assert_number_of_torrents(session_browser, 1)


def _assert_number_of_torrents(session_browser, torrents_number):
    functional.visit(session_browser, '/transmission')
    assert functional.eventually(
        lambda: torrents_number == _get_number_of_torrents(session_browser))


def _remove_all_torrents(browser):
    """Remove all torrents from transmission."""
    functional.visit(browser, '/transmission')
    while True:
        torrents = browser.find_by_css('#torrent_list .torrent')
        if not torrents:
            break

        torrents.first.click()
        functional.eventually(browser.is_element_not_present_by_css,
                              args=['#toolbar-remove.disabled'])
        browser.click_link_by_id('toolbar-remove')
        functional.eventually(
            browser.is_element_not_present_by_css,
            args=['#dialog-container[style="display: none;"]'])
        browser.click_link_by_id('dialog_confirm_button')
        functional.eventually(browser.is_element_present_by_css,
                              args=['#toolbar-remove.disabled'])


def _upload_sample_torrent(browser):
    """Upload a sample torrent into transmission."""
    functional.visit(browser, '/transmission')
    file_path = os.path.join(os.path.dirname(__file__), 'data',
                             'sample.torrent')
    browser.click_link_by_id('toolbar-open')
    functional.eventually(browser.is_element_not_present_by_css,
                          args=['#upload-container[style="display: none;"]'])
    browser.attach_file('torrent_files[]', [file_path])
    browser.click_link_by_id('upload_confirm_button')
    functional.eventually(browser.is_element_present_by_css,
                          args=['#torrent_list .torrent'])


def _get_number_of_torrents(browser):
    """Return the number torrents currently in transmission."""
    return len(browser.find_by_css('#torrent_list .torrent'))
