Skip to content

Commit 6a7cad3

Browse files
committed
[tests] Added browser test
1 parent e114404 commit 6a7cad3

5 files changed

Lines changed: 98 additions & 0 deletions

File tree

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ jobs:
132132
pip install -U pip setuptools wheel
133133
pip install -U -e ".[saml]"
134134
pip install -U -r requirements-test.txt
135+
pip install --no-deps --no-cache-dir --force-reinstall "https://github.com/openwisp/openwisp-users/tarball/issues/497-export-users"
135136
pip install -U "Django~=5.2.0"
136137
./tests/manage.py migrate
137138

browser-test/browser_test_utils.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88

99
def cleanup_test_data(test_data):
1010
mobile_data = test_data["mobileVerificationTestUser"]
11+
cross_org_data = test_data["crossOrgPhoneVerificationUser"]
1112
User.objects.filter(username=test_data["testuser"]["email"]).delete()
1213
User.objects.filter(username=test_data["expiredPasswordUser"]["email"]).delete()
14+
User.objects.filter(username=cross_org_data["email"]).delete()
1315
User.objects.filter(username=mobile_data["phoneNumber"]).delete()
1416
User.objects.filter(username=mobile_data["changePhoneNumber"]).delete()
1517
Organization.objects.filter(name=mobile_data["organization"]).delete()
1618
RadiusAccounting.objects.filter(username=test_data["testuser"]["email"]).delete()
19+
RadiusAccounting.objects.filter(username=cross_org_data["email"]).delete()
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import {until} from "selenium-webdriver";
2+
import {
3+
getDriver,
4+
getElementByCss,
5+
urls,
6+
initialData,
7+
initializeData,
8+
tearDown,
9+
getPhoneToken,
10+
successToastSelector,
11+
} from "./utils";
12+
13+
describe("Selenium tests for cross-organization phone verification", () => {
14+
let driver;
15+
16+
beforeAll(async () => {
17+
await initializeData("crossOrgPhoneVerification");
18+
driver = await getDriver();
19+
}, 30000);
20+
21+
afterAll(async () => {
22+
await tearDown(driver);
23+
});
24+
25+
it("should login to a new organization and complete phone verification", async () => {
26+
const data = initialData().crossOrgPhoneVerificationUser;
27+
await driver.get(urls.verificationLogin(data.targetOrganization));
28+
const username = await getElementByCss(driver, "input#username");
29+
await username.sendKeys(data.phoneNumber);
30+
const password = await getElementByCss(driver, "input#password");
31+
await password.sendKeys(data.password);
32+
const submitBtn = await getElementByCss(driver, "input[type=submit]");
33+
await submitBtn.click();
34+
const successToastDiv = await getElementByCss(driver, successToastSelector);
35+
await driver.wait(until.elementIsVisible(successToastDiv));
36+
await driver.wait(
37+
until.urlContains(
38+
`/${data.targetOrganization}/mobile-phone-verification`,
39+
),
40+
5000,
41+
);
42+
const codeInput = await getElementByCss(driver, "input#code");
43+
const token = getPhoneToken();
44+
await codeInput.sendKeys(token);
45+
const verifyBtn = await getElementByCss(driver, "button[type='submit']");
46+
await verifyBtn.click();
47+
await driver.wait(
48+
until.urlContains(`/${data.targetOrganization}/status`),
49+
5000,
50+
);
51+
const emailElement = await getElementByCss(
52+
driver,
53+
"div > p:nth-child(5) > span",
54+
);
55+
expect(await emailElement.getText()).toEqual(data.email);
56+
});
57+
});

browser-test/initialize_data.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def load_test_data():
2323
# do not initialize data for registration tests
2424
registration_tests = "register" in sys.argv
2525
create_mobile_verification_org = "mobileVerification" in sys.argv
26+
cross_org_phone_verification_tests = "crossOrgPhoneVerification" in sys.argv
2627
expired_password_tests = "expiredPassword" in sys.argv
2728

2829
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
@@ -79,6 +80,34 @@ def load_test_data():
7980
RegisteredUser.objects.create(user=user, method=data["method"])
8081
OrganizationUser.objects.create(organization=org, user=user)
8182

83+
if cross_org_phone_verification_tests:
84+
data = test_data["crossOrgPhoneVerificationUser"]
85+
target_org, _ = Organization.objects.get_or_create(slug=data["targetOrganization"], name=data["targetOrganization"])
86+
target_settings, created = OrganizationRadiusSettings.objects.get_or_create(
87+
organization=target_org,
88+
defaults={
89+
"needs_identity_verification": True,
90+
"sms_verification": True,
91+
"sms_sender": data["email"],
92+
},
93+
)
94+
if not created:
95+
target_settings.needs_identity_verification = True
96+
target_settings.sms_verification = True
97+
target_settings.sms_sender = data["email"]
98+
target_settings.save()
99+
cross_org_user = User.objects.create_user(
100+
username=data["phoneNumber"],
101+
password=data["password"],
102+
email=data["email"],
103+
phone_number=data["phoneNumber"],
104+
)
105+
source_org = Organization.objects.get(slug=data["sourceOrganization"])
106+
OrganizationUser.objects.create(organization=source_org, user=cross_org_user)
107+
RegisteredUser.objects.create(
108+
user=cross_org_user, method=data["method"], is_verified=True
109+
)
110+
82111

83112
try:
84113
org = Organization.objects.get(slug=test_user_organization)

browser-test/testData.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,13 @@
1919
"method": "mobile_phone",
2020
"changePhoneNumber": "+393660011333"
2121
},
22+
"crossOrgPhoneVerificationUser": {
23+
"email": "crossorg-phone@openwisp.org",
24+
"password": "testuser",
25+
"sourceOrganization": "default",
26+
"targetOrganization": "mobile",
27+
"phoneNumber": "+911234567890",
28+
"method": "mobile_phone"
29+
},
2230
"allOrgScript": "analytics.js"
2331
}

0 commit comments

Comments
 (0)