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