import pytest
# Simulated login function
def login(username, password):
valid_users = {"admin": "adminpass", "guest": "guestpass", "user": "userpass"}
return valid_users.get(username) == password
# Fixture that receives user role indirectly
@pytest.fixture
def user(request):
role = request.param
credentials = {
"admin": ("admin", "adminpass"),
"guest": ("guest", "guestpass"),
"user": ("user", "userpass")
}
return credentials[role]
# Test function using indirect parametrize
@pytest.mark.parametrize("user", ["admin", "guest", "user"], indirect=True)
def test_login(user):
username, password = user
assert login(username, password) is True
This code defines a login function that checks if the username and password match known valid users.
The user fixture uses request.param to receive the user role indirectly from the test parameter. It returns the corresponding credentials tuple.
The test test_login uses pytest.mark.parametrize with indirect=True to pass the user roles to the user fixture. For each role, it gets credentials and asserts that login succeeds.
This approach keeps test data separate from setup logic and makes tests clear and reusable.