Skip to content

Commit 140f045

Browse files
authored
Merge pull request alexmojaki#406 from alexmojaki/saucelabs
Saucelabs
2 parents 083bb99 + 1651f93 commit 140f045

File tree

4 files changed

+87
-23
lines changed

4 files changed

+87
-23
lines changed

.github/workflows/workflow.yml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
name: Build, test, deploy
1+
name: CI
22
on: [push, pull_request]
33
jobs:
44
test:
5-
runs-on: ubuntu-latest
5+
runs-on: ubuntu-20.04
66
steps:
77
- uses: actions/checkout@v2
88
- name: Set up Python
@@ -25,10 +25,20 @@ jobs:
2525
REACT_APP_FIREBASE_STAGING: '1'
2626
FUTURECODER_LANGUAGE: en
2727
run: ./scripts/build.sh
28+
- name: Saucelabs tunnel
29+
uses: saucelabs/sauce-connect-action@v2
30+
with:
31+
username: ${{ secrets.SAUCE_USERNAME }}
32+
accessKey: ${{ secrets.SAUCE_ACCESS_KEY }}
33+
tunnelName: github-action-tunnel
34+
region: eu-central
2835
- name: Test
2936
env:
3037
FUTURECODER_LANGUAGE: en
3138
FIREBASE_TOKEN: '1//03I37hFeN4kn3CgYIARAAGAMSNwF-L9IrUvqofZbhOkS8YMtQBhw_bu2TpWYC5MHvnaZDsWPP0KJMypXPyoxogkl8A6p2RxPJQwQ'
39+
SAUCE_TUNNEL: github-action-tunnel
40+
SAUCE_USERNAME: ${{ secrets.SAUCE_USERNAME }}
41+
SAUCE_ACCESS_KEY: ${{ secrets.SAUCE_ACCESS_KEY }}
3242
run: ./scripts/ci_test.sh
3343
- name: Upload test artifacts
3444
uses: actions/upload-artifact@v2

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
<p align="center">
2-
<img src="homepage/static/logo/bordered2.png" width="300px" height="300px" alt="logo">
2+
<a href="https://github.com/alexmojaki/futurecoder/blob/master/LICENSE.txt"><img src="https://img.shields.io/github/license/alexmojaki/futurecoder?style=flat" alt="MIT license" align="left"></a>
3+
<a href="https://github.com/alexmojaki/futurecoder/actions"><img src="https://github.com/alexmojaki/futurecoder/workflows/CI/badge.svg" alt="Tests status" align="left"></a>
4+
<img src="homepage/static/logo/bordered2.png" width="300px" height="300px" alt="logo">
5+
<a href="https://saucelabs.com"><img src="https://opensource.saucelabs.com/images/opensauce/powered-by-saucelabs-badge-gray.png?sanitize=true" alt="Testing Powered By SauceLabs" align="right"></a>
36
</p>
47

58
<h1 align="center"><code>futurecoder</code></h1>

scripts/ci_test.sh

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,5 @@ set -eux
44

55
# Run tests in CI, i.e. GitHub Actions
66

7-
export DISPLAY=:99
8-
chromedriver --url-base=/wd/hub &
97
npm install -g firebase-tools
108
firebase emulators:exec "poetry run pytest tests"

tests/test_frontend.py

Lines changed: 71 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
import sys
23
from pathlib import Path
34
from time import sleep
@@ -17,30 +18,82 @@
1718
assets_dir = this_dir / "test_frontend_assets"
1819
assets_dir.mkdir(exist_ok=True)
1920

21+
sauce_tunnel = os.environ.get("SAUCE_TUNNEL")
2022

21-
def test_frontend():
22-
options = Options()
23-
options.add_argument("--headless")
24-
options.add_argument("--disable-gpu")
25-
desired_capabilities = DesiredCapabilities.CHROME
26-
desired_capabilities["goog:loggingPrefs"] = {"browser": "ALL"}
27-
driver = webdriver.Chrome(
28-
options=options, desired_capabilities=desired_capabilities
29-
)
23+
24+
def get_driver(caps):
25+
if sauce_tunnel:
26+
desired_capabilities = {
27+
**caps,
28+
"sauce:options": {
29+
"tunnelName": sauce_tunnel,
30+
"name": "futurecoder",
31+
},
32+
}
33+
url = "https://{SAUCE_USERNAME}:{SAUCE_ACCESS_KEY}@ondemand.eu-central-1.saucelabs.com:443/wd/hub".format(
34+
**os.environ
35+
)
36+
driver = webdriver.Remote(
37+
command_executor=url,
38+
desired_capabilities=desired_capabilities,
39+
)
40+
else:
41+
options = Options()
42+
options.add_argument("--headless")
43+
options.add_argument("--disable-gpu")
44+
desired_capabilities = DesiredCapabilities.CHROME
45+
desired_capabilities["goog:loggingPrefs"] = {"browser": "ALL"}
46+
driver = webdriver.Chrome(
47+
options=options, desired_capabilities=desired_capabilities
48+
)
3049
driver.set_window_size(1024, 768)
3150
driver.implicitly_wait(5)
51+
return driver
52+
53+
54+
def params():
55+
if not sauce_tunnel:
56+
yield None
57+
return
58+
for os_name, extra_browser, os_versions in [
59+
["Windows", "MicrosoftEdge", ["11", "10"]],
60+
["macOS", "Safari", ["12", "11.00"]],
61+
]:
62+
for os_version in os_versions[:1]: # TODO use all versions
63+
for browser in ["Chrome", "Firefox", extra_browser]:
64+
caps = dict(
65+
platform=f"{os_name} {os_version}",
66+
version="latest",
67+
browserName=browser,
68+
)
69+
if browser == "Safari" and os_version == "12":
70+
yield caps | {"version": "15"}
71+
else:
72+
yield caps
73+
return # TODO
74+
75+
76+
@pytest.mark.parametrize("caps", list(params()))
77+
def test_frontend(caps):
78+
driver = get_driver(caps)
79+
status = "failed"
3280
try:
3381
_tests(driver)
82+
status = "passed"
3483
finally:
35-
driver.save_screenshot(str(assets_dir / "screenshot.png"))
36-
(assets_dir / "logs.txt").write_text(
37-
"\n".join(entry["message"] for entry in driver.get_log("browser"))
38-
)
39-
(assets_dir / "page_source.html").write_text(driver.page_source)
40-
(assets_dir / "state.json").write_text(
41-
driver.execute_script("return JSON.stringify(reduxStore.getState())")
42-
)
43-
driver.close()
84+
if sauce_tunnel:
85+
driver.execute_script(f"sauce:job-result={status}")
86+
try:
87+
driver.save_screenshot(str(assets_dir / "screenshot.png"))
88+
(assets_dir / "logs.txt").write_text(
89+
"\n".join(entry["message"] for entry in driver.get_log("browser"))
90+
)
91+
(assets_dir / "page_source.html").write_text(driver.page_source)
92+
(assets_dir / "state.json").write_text(
93+
driver.execute_script("return JSON.stringify(reduxStore.getState())")
94+
)
95+
finally:
96+
driver.quit()
4497

4598

4699
def _tests(driver):

0 commit comments

Comments
 (0)