def pytest_addoption(parser):
    parser.addoption("-U", action="append", default=[], help="list of users to pass to CLI to test functions")

def pytest_generate_tests(metafunc):
    if "U" in metafunc.fixturenames:
        metafunc.parametrize("U", metafunc.config.getoption("U"))

def login(browser, user, password='default_password'):
    if user == 'user5': password = 'special_password'
    context = browser.new_context()
    page = context.new_page()
    page.set_default_timeout(45000)
    page.goto(url + '/login.jsp')
    page.wait_for_load_state("networkidle")
    expect(page.get_by_text("MyApp")).to_be_visible()
    if page.get_by_text("I do not have a PKI certificate").is_visible():
        page.get_by_text("I do not have a PKI certificate").click()
    page.get_by_placeholder("Username").fill(user)
    page.get_by_placeholder("Password").fill(password)
    page.get_by_role("button", name="Sign In").click()
    page.close()
    ValueStorage.contexts.update({user: context})
    return context

class ValueStorage:
    contexts = {}
    non_us_ms_hidden = None

@pytest.fixture()
def cli_user(browser, U):
    page = find_context(browser, U)
    yield page
    page.close()

@pytest.fixture()
def user1(browser):
    page = find_context(browser, 'user1')
    yield page
    page.close()

@pytest.fixture()
def user2(browser):
    page = find_context(browser, 'user2')
    yield page
    page.close()

@pytest.fixture()
def user3(browser):
    page = find_context(browser, 'user3')
    yield page
    page.close()

@pytest.fixture()
def user3(browser):
    page = find_context(browser, 'user3')
    yield page
    page.close()

def find_context(browser, user):
    try:
        user_context = ValueStorage.contexts[user]
    except KeyError:
        user_context = login(browser, user)
    return user_context.new_page()