#!/usr/bin/python3 import unittest from unittest.mock import patch, call from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import jardin class TestJardin(unittest.TestCase): @patch("jardin.webdriver.Firefox") def test_initialize_webdriver_calls_Firefox(self, mockFirefox): jardin.initialize_webdriver() mockFirefox.assert_called_once() @patch("jardin.webdriver.Firefox") def test_navigate_to_filegarden(self, mockFirefox): jardin.navigate_to_filegarden(mockFirefox) mockFirefox.get.assert_called_once_with("https://filegarden.com/login") @patch("jardin.webdriver.Firefox") def test_input_email_enters_email(self, mockFirefox): mockEmail = "email@mail.com" jardin.input_email(mockFirefox, mockEmail) mockFirefox.find_element.assert_called_with(By.ID, "email") mockFirefox.find_element.return_value.send_keys.assert_has_calls([ call(mockEmail), call(Keys.RETURN) ]) @patch("jardin.webdriver.Firefox") def test_click_password_button_clicks_button(self, mockFirefox): jardin.click_password_button(mockFirefox) mockFirefox.find_element.assert_called_with(By.XPATH, "/html/body/div[2]/div[3]/div[1]/form/div[1]/span/button[3]") mockFirefox.find_element.return_value.click.assert_called_once() @patch("jardin.webdriver.Firefox") def test_input_password_enters_password(self, mockFirefox): mockPassword = "p4$$w0rd" jardin.input_password(mockFirefox, mockPassword) mockFirefox.find_element.assert_called_with(By.ID, "password") mockFirefox.find_element.return_value.send_keys.assert_has_calls([ call(mockPassword), call(Keys.RETURN) ]) @patch("jardin.webdriver.Firefox") @patch("jardin.input_email") @patch("jardin.click_password_button") @patch("jardin.input_password") def test_login_with_password_performs_login_steps(self, mockInputPassword, mockClickPasswordButton, mockInputEmail, mockFirefox): mockEmail = "email@mail.com" mockPassword = "p4$$w0rd" jardin.login_with_password(mockFirefox, mockEmail, mockPassword) mockInputEmail.assert_called_once_with(mockFirefox, mockEmail) mockClickPasswordButton.assert_called_once_with(mockFirefox) mockInputPassword.assert_called_once_with(mockFirefox, mockPassword) @patch("jardin.webdriver.Firefox") def test_click_go_to_your_garden_clicks_button(self, mockFirefox): jardin.click_go_to_your_garden(mockFirefox) mockFirefox.find_element.assert_called_with(By.LINK_TEXT, "GO TO YOUR GARDEN") mockFirefox.find_element.return_value.click.assert_called_once() @patch("jardin.webdriver.Firefox") @patch("jardin.bs4.BeautifulSoup") def test_get_garden_filenames_creates_beautifulsoup_and_finds_names(self, mockBeautifulSoup, mockFirefox): jardin.get_garden_filenames(mockFirefox) mockBeautifulSoup.assert_called_once_with(mockFirefox.page_source, "lxml") mockBeautifulSoup.return_value.find_all.assert_called_once_with(attrs={"class": "name"}) @patch("jardin.webdriver.Firefox") def test_get_garden_filenames_returns_filenames_correctly(self, mockFirefox): mockFirefox.page_source = """
file1.jpg
10 B
image/jpeg
Aug 30 2023 13:04:10
file2.jpg
20 B
image/jpeg
Jun 29 2022 17:37:14
""" filenames = jardin.get_garden_filenames(mockFirefox) self.assertEqual(filenames, ["file1.jpg", "file2.jpg"]) @patch("jardin.os.listdir") def test_get_local_filenames_gets_filenames_in_local_directory(self, mockListdir): mockDirectory = "/home/luser/gardenfiles/" mockFiles = ["file1", "file2", "file3"] mockListdir.return_value = mockFiles localFiles = jardin.get_local_filenames(mockDirectory) mockListdir.assert_called_once_with(mockDirectory) self.assertEqual(localFiles, mockFiles) def test_get_missing_filenames_returns_local_filenames_without_garden_filenames(self): mockLocalFilenames = ["file1.jpg", "file2.jpg", "file3.jpg", "file4.jpg", "file5.jpg"] mockGardenFilenames = ["file2.jpg", "file4.jpg", "file6.jpg", "file8.jpg", "file10.jpg"] missingFilenames = jardin.get_missing_filenames(mockLocalFilenames, mockGardenFilenames) self.assertEqual(missingFilenames, ["file1.jpg", "file3.jpg", "file5.jpg"]) @patch("jardin.webdriver.Firefox") def test_create_file_input_runs_correct_script(self, mockFirefox): expectedScript = """const fileInput = document.createElement("input"); fileInput.id = "upload"; fileInput.type = "file"; fileInput.multiple = true; fileInput.addEventListener("change", () => { for (const file of fileInput.files) { console.log(file); // Debug // Miro.request(file); // What I'll probably actually use (or wrapper method) //addFile(file); // Original (token not accessible from minified code) } fileInput.value = null; }); document.body.appendChild(fileInput); """ jardin.create_file_input(mockFirefox) mockFirefox.execute_script.assert_called_once_with(expectedScript) @patch("jardin.webdriver.Firefox") def test_get_user_id_returns_user_id_from_url(self, mockFirefox): mockUserId = "73927475b259be67f8cea98f" mockUrl = f"https://filegarden.com/users/{mockUserId}/garden/#" mockFirefox.current_url = mockUrl userId = jardin.get_user_id(mockFirefox) self.assertEqual(userId, mockUserId) @patch("jardin.get_user_id") @patch("jardin.create_file_input") @patch("jardin.webdriver.Firefox") def test_upload_files_calls_correct_setup_methods(self, mockFirefox, mockCreateFileInput, mockGetUserId): jardin.upload_files(mockFirefox, "", []) mockCreateFileInput.assert_called_once_with(mockFirefox) mockGetUserId.assert_called_once_with(mockFirefox) @patch("jardin.get_user_id") @patch("jardin.webdriver.Firefox") def test_upload_files_calls_upload_file_once_per_file(self, mockFirefox, mockGetUserId): mockGetUserId.return_value = "userid" mockFiles = ["file1.jpg", "file2.jpg", "file3.jpg"] mockDirectory = "/home/luser/gardenfiles/" jardin.upload_files(mockFirefox, mockDirectory, mockFiles) mockFirefox.find_element.return_value.send_keys.assert_has_calls([ call(mockDirectory + "file1.jpg"), call(mockDirectory + "file2.jpg"), call(mockDirectory + "file3.jpg") ]) @patch("jardin.initialize_webdriver") @patch("jardin.navigate_to_filegarden") @patch("jardin.login_with_password") @patch("jardin.click_go_to_your_garden") @patch("jardin.get_garden_filenames") @patch("jardin.get_local_filenames") @patch("jardin.get_missing_filenames") @patch("jardin.upload_files") def test_main_calls_methods_in_correct_order(self, mockUploadFiles, mockGetMissingFilenames, mockGetLocalFilenames, mockGetGardenFilenames, mockClickGoToYourGarden, mockLoginWithPassword, mockNavigateToFilegarden, mockInitializeWebdriver): mockEmail = "email@mail.com" mockPassword = "p4$$w0rd" mockDirectory = "/home/luser/gardenfiles/" jardin.main(mockEmail, mockPassword, mockDirectory) mockInitializeWebdriver.assert_called_once() mockNavigateToFilegarden.assert_called_once_with(mockInitializeWebdriver.return_value) mockLoginWithPassword.assert_called_once_with(mockInitializeWebdriver.return_value, mockEmail, mockPassword) mockClickGoToYourGarden.assert_called_once_with(mockInitializeWebdriver.return_value) mockGetGardenFilenames.assert_called_once_with(mockInitializeWebdriver.return_value) mockGetLocalFilenames.assert_called_once_with(mockDirectory) mockGetMissingFilenames.assert_called_once_with(mockGetLocalFilenames.return_value, mockGetGardenFilenames.return_value) mockUploadFiles.assert_called_once_with(mockInitializeWebdriver.return_value, mockDirectory, mockGetMissingFilenames.return_value) #mockInitializeWebdriver.return_value.close.assert_called_once() if __name__ == "__main__": unittest.main()