at 24.11-pre 5.8 kB view raw
1import ./make-test-python.nix ({ pkgs, lib, ... }: { 2 name = "filesender"; 3 meta = { 4 maintainers = with lib.maintainers; [ nhnn ]; 5 broken = pkgs.stdenv.isAarch64; # selenium.common.exceptions.WebDriverException: Message: Unsupported platform/architecture combination: linux/aarch64 6 }; 7 8 nodes.filesender = { ... }: let 9 format = pkgs.formats.php { }; 10 in { 11 networking.firewall.allowedTCPPorts = [ 80 ]; 12 13 services.filesender.enable = true; 14 services.filesender.localDomain = "filesender"; 15 services.filesender.settings = { 16 auth_sp_saml_authentication_source = "default"; 17 auth_sp_saml_uid_attribute = "uid"; 18 storage_filesystem_path = "/tmp"; 19 site_url = "http://filesender"; 20 force_ssl = false; 21 admin = ""; 22 admin_email = "admin@localhost"; 23 email_reply_to = "noreply@localhost"; 24 }; 25 services.simplesamlphp.filesender = { 26 settings = { 27 baseurlpath = "http://filesender/saml"; 28 "module.enable".exampleauth = true; 29 }; 30 authSources = { 31 admin = [ "core:AdminPassword" ]; 32 default = format.lib.mkMixedArray [ "exampleauth:UserPass" ] { 33 "user:password" = { 34 uid = [ "user" ]; 35 cn = [ "user" ]; 36 mail = [ "user@nixos.org" ]; 37 }; 38 }; 39 }; 40 }; 41 }; 42 43 nodes.client = 44 { pkgs 45 , nodes 46 , ... 47 }: 48 let 49 filesenderIP = (builtins.head (nodes.filesender.networking.interfaces.eth1.ipv4.addresses)).address; 50 in 51 { 52 networking.hosts.${filesenderIP} = [ "filesender" ]; 53 54 environment.systemPackages = 55 let 56 username = "user"; 57 password = "password"; 58 browser-test = 59 pkgs.writers.writePython3Bin "browser-test" 60 { 61 libraries = [ pkgs.python3Packages.selenium ]; 62 flakeIgnore = [ "E124" "E501" ]; 63 } '' 64 from selenium.webdriver.common.by import By 65 from selenium.webdriver import Firefox 66 from selenium.webdriver.firefox.options import Options 67 from selenium.webdriver.firefox.firefox_profile import FirefoxProfile 68 from selenium.webdriver.firefox.service import Service 69 from selenium.webdriver.support.ui import WebDriverWait 70 from selenium.webdriver.support import expected_conditions as EC 71 from subprocess import STDOUT 72 import string 73 import random 74 import logging 75 import time 76 selenium_logger = logging.getLogger("selenium") 77 selenium_logger.setLevel(logging.DEBUG) 78 selenium_logger.addHandler(logging.StreamHandler()) 79 profile = FirefoxProfile() 80 profile.set_preference("browser.download.folderList", 2) 81 profile.set_preference("browser.download.manager.showWhenStarting", False) 82 profile.set_preference("browser.download.dir", "/tmp/firefox") 83 profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain;text/txt") 84 options = Options() 85 options.profile = profile 86 options.add_argument('--headless') 87 service = Service(log_output=STDOUT) 88 driver = Firefox(options=options) 89 driver.set_window_size(1024, 768) 90 driver.implicitly_wait(30) 91 driver.get('http://filesender/') 92 wait = WebDriverWait(driver, 20) 93 wait.until(EC.title_contains("FileSender")) 94 driver.find_element(By.ID, "btn_logon").click() 95 wait.until(EC.title_contains("Enter your username and password")) 96 driver.find_element(By.ID, 'username').send_keys( 97 '${username}' 98 ) 99 driver.find_element(By.ID, 'password').send_keys( 100 '${password}' 101 ) 102 driver.find_element(By.ID, "submit_button").click() 103 wait.until(EC.title_contains("FileSender")) 104 wait.until(EC.presence_of_element_located((By.ID, "topmenu_logoff"))) 105 test_string = "".join(random.choices(string.ascii_uppercase + string.digits, k=20)) 106 with open("/tmp/test_file.txt", "w") as file: 107 file.write(test_string) 108 driver.find_element(By.ID, "files").send_keys("/tmp/test_file.txt") 109 time.sleep(2) 110 driver.find_element(By.CSS_SELECTOR, '.start').click() 111 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".download_link"))) 112 download_link = driver.find_element(By.CSS_SELECTOR, '.download_link > textarea').get_attribute('value').strip() 113 driver.get(download_link) 114 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".download"))) 115 driver.find_element(By.CSS_SELECTOR, '.download').click() 116 wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".ui-dialog-buttonset > button:nth-child(2)"))) 117 driver.find_element(By.CSS_SELECTOR, ".ui-dialog-buttonset > button:nth-child(2)").click() 118 driver.close() 119 driver.quit() 120 ''; 121 in 122 [ 123 pkgs.firefox-unwrapped 124 pkgs.geckodriver 125 browser-test 126 ]; 127 }; 128 129 testScript = '' 130 start_all() 131 filesender.wait_for_file("/run/phpfpm/filesender.sock") 132 filesender.wait_for_open_port(80) 133 if "If you have received an invitation to access this site as a guest" not in client.wait_until_succeeds("curl -sS -f http://filesender"): 134 raise Exception("filesender returned invalid html") 135 client.succeed("browser-test") 136 ''; 137})