Source code for organisations.tests.integration.04_club_members

import datetime
import time
from datetime import timedelta

from django.utils.timezone import now

from organisations.models import Organisation, MemberMembershipType
from organisations.tests.integration.common_functions import (
    club_menu_go_to_tab,
    login_and_go_to_club_menu,
)
from tests.integration.common_functions import cobalt_htmx_user_search
from tests.test_manager import CobaltTestManagerIntegration

# TODO: See if these constants can be centrally stored

# State id numbers
NSW = 3
QLD = 5

# Org org_id numbers
CANBERRA_ID = 1851
TRUMPS_ID = 2259
SUNSHINE_ID = 4680
WAVERLEY_ID = 3480

# Org names
club_names = {
    CANBERRA_ID: "Canberra Bridge Club Inc",  # ACT
    TRUMPS_ID: "Trumps Bridge Centre",  # NSW
    SUNSHINE_ID: "Sunshine Coast Contract Bridge Club Inc",  # QLD
    WAVERLEY_ID: "Waverley Bridge Club",  # VIC
}


def _csv_upload_helper(
    manager,
    system_number,
    first_name,
    last_name,
    bridge_club,
    test_name,
    expect_to_fail=False,
):
    """helper to upload a CSV and check it works. Only processes one row. Must already be on the upload page"""

    # Create CSV
    with open("/tmp/members.csv", "w") as csv:
        csv.write(
            "ABF Number, First Name, Last Name, Email, Membership Type, Address 1, Address 2, State, Postcode, Preferred Phone, Other Phone, Date of Birth, Club Membership Number, Joined Date, Left Date, Emergency Contact, Notes, Membership Start Date, Membership End Date, Auto Pay Date, Lapse Date\n"
        )

        membership_start_date = now().date().strftime("%d/%m/%Y")
        membership_end_date = datetime.date(
            year=now().year + 1, month=1, day=1
        ).strftime("%d/%m/%Y")
        membership_auto_pay_date = (
            (now() + timedelta(days=5)).date().strftime("%d/%m/%Y")
        )
        membership_lapse_date = (now() + timedelta(days=10)).date().strftime("%d/%m/%Y")

        csv.write(
            f"{system_number}, {first_name}, {last_name}, email@madeup.com,Standard, 1 High St, Low Country, NSW, 2000,,,,,2000-01-01,,Harry Potter,These are notes,{membership_start_date},{membership_end_date},{membership_auto_pay_date},{membership_lapse_date}\n"
        )

    # Import from CSV
    # Click Add
    manager.selenium_wait_for("t_member_tab_add").click()
    # Click MPC Import
    manager.selenium_wait_for("t_csv_upload").click()
    # find file button
    file_button = manager.selenium_wait_for("file-upload")

    file_button.send_keys("/tmp/members.csv")

    # click the submit button
    manager.selenium_wait_for("upload_pianola").click()

    # Wait
    manager.selenium_find_text_on_page("Import Complete")

    # Check membership was created
    membership = MemberMembershipType.objects.filter(
        membership_type__organisation=bridge_club, system_number=system_number
    ).first()

    status = bool(membership)

    if expect_to_fail:
        status = not status

    output = manager.selenium_wait_for("t_import_warnings").text

    manager.save_results(
        status=status,
        test_name=f"Member CSV Upload - {test_name}",
        test_description=f"Import {first_name} {last_name} - {system_number}. {expect_to_fail=}",
        output=output,
    )

    if expect_to_fail:
        return

    # Check start and end dates
    manager.save_results(
        status=membership.start_date.strftime("%d/%m/%Y") == membership_start_date,
        test_name=f"Member CSV Upload - {test_name} Start Date",
        test_description=f"Import {first_name} {last_name} - {system_number}. {expect_to_fail=}",
        output=f"{membership.start_date=} {membership_start_date=}",
    )

    # TODO - See if this is a timezone issue
    print(f"{membership.end_date=}")
    print(f"{membership.end_date + timedelta(days=1)}")
    print(f"{(membership.end_date + timedelta(days=1)).strftime("%d/%m/%Y")}")
    print(f"{membership_end_date}")

    # logic for end date is it will use the day before, not the day provided
    manager.save_results(
        status=membership.end_date.strftime("%d/%m/%Y") == membership_end_date,
        # status=(membership.end_date + timedelta(days=1)).strftime("%d/%m/%Y") == membership_end_date,
        test_name=f"Member CSV Upload - {test_name} End Date",
        test_description=f"Import {first_name} {last_name} - {system_number}. {expect_to_fail=}",
        output=f"Dates are expected to be out by one. {membership.end_date=} {membership_end_date=}",
    )


[docs] class ClubMembers: """Tests for club menu members. Some of these tests connect to the MPC so data may change over time.""" def __init__(self, manager: CobaltTestManagerIntegration): self.manager = manager self.client = self.manager.client
[docs] def a1_import_members(self): """Import Members to this club""" # Login as Colin (no update access to members) login_and_go_to_club_menu( manager=self.manager, org_id=SUNSHINE_ID, user=self.manager.colin, test_description="Login as Colin and go to club menu. Colin doesn't have update access to members.", test_name=f"Login as Colin and go to club menu for {club_names[SUNSHINE_ID]}", reverse_result=False, ) # Go to Members tab club_menu_go_to_tab( manager=self.manager, tab="members", title_id="id_member_list_tab", test_name=f"Go to Members tab as Colin for {club_names[SUNSHINE_ID]}", test_description="Starting from the dashboard of Club Menu we click on the Members tab " "and confirm that we get there.", ) ok = not bool(self.manager.selenium_wait_for("t_member_tab_add", timeout=5)) self.manager.save_results( status=ok, output=f"Clicked on Membership tab for {club_names[SUNSHINE_ID]} as Colin. Shouldn't get the Add sub-tab. " f"Outcome: {ok}", test_name=f"Colin cannot add members for {club_names[SUNSHINE_ID]}", test_description=f"Colin goes to the members tab for {club_names[SUNSHINE_ID]}. " f"He shouldn't see Add as an option as he doesn't have access.", ) # Login as Eric login_and_go_to_club_menu( manager=self.manager, org_id=SUNSHINE_ID, user=self.manager.eric, test_description="Login as Eric (admin) and go to club menu", test_name="Login as Eric and go to club menu", reverse_result=False, ) # Go to Members tab club_menu_go_to_tab( manager=self.manager, tab="members", title_id="id_member_list_tab", test_name=f"Go to Members tab as Eric for {club_names[SUNSHINE_ID]}", test_description="Starting from the dashboard of Club Menu we click on the Members tab " "and confirm that we get there.", ) ok = bool(self.manager.selenium_wait_for("t_member_tab_add")) self.manager.save_results( status=ok, output=f"Clicked on Membership tab for {club_names[SUNSHINE_ID]} as Eric (admin). Should get the Add sub-tab. " f"Outcome: {ok}", test_name=f"Eric can add members for {club_names[SUNSHINE_ID]}", test_description=f"Eric goes to the members tab for {club_names[SUNSHINE_ID]}. " f"He should see Add as an option as he does have access.", ) # Import from MPC # Click Add self.manager.selenium_wait_for("t_member_tab_add").click() # Click MPC Import self.manager.selenium_wait_for("t_mpc_import").click() # Click Save self.manager.selenium_wait_for("t_mpc_import_save").click() ok = bool(self.manager.selenium_wait_for_text("Import Complete", "members", 20)) self.manager.save_results( status=ok, output=f"Ran MPC import for {club_names[SUNSHINE_ID]} as Eric (admin). Got 'Import Complete'" f"Outcome: {ok}", test_name=f"Eric imports members from MPC for {club_names[SUNSHINE_ID]}", test_description=f"Eric imports members from MPC for {club_names[SUNSHINE_ID]}. " f"He should be able to do this successfully.", )
[docs] def a2_import_members_csv(self): """Import members from CSV files""" # Get bridge club fantasy_bc = Organisation.objects.filter(name="Fantasy Bridge Club").first() # Login as Alan login_and_go_to_club_menu( manager=self.manager, org_id=fantasy_bc.org_id, user=self.manager.alan, test_description="Login as Alan (admin) and go to club menu", test_name="Login as Alan and go to club menu", reverse_result=False, ) # Go to Members tab club_menu_go_to_tab( manager=self.manager, tab="members", title_id="id_member_list_tab", test_name=f"Go to Members tab as Alan for {fantasy_bc}", test_description="Starting from the dashboard of Club Menu we click on the Members tab " "and confirm that we get there.", ) ok = bool(self.manager.selenium_wait_for("t_member_tab_add")) self.manager.save_results( status=ok, output=f"Clicked on Membership tab for {fantasy_bc} as Alan (admin). Should get the Add sub-tab. " f"Outcome: {ok}", test_name=f"Alan can add members for {fantasy_bc}", test_description=f"Alan goes to the members tab for {fantasy_bc}. " f"He should see Add as an option as he does have access.", ) # Have to use real data for now as need valid ABF numbers data = [ {"system_number": 136131, "first_name": "David", "last_name": "Fryda"}, {"system_number": 101, "first_name": "Betty", "last_name": "Bunting"}, {"system_number": 24732, "first_name": "Pauline", "last_name": "Gumby"}, {"system_number": 35238, "first_name": "Warren", "last_name": "Lazer"}, ] # Basic success _csv_upload_helper( self.manager, data[0]["system_number"], data[0]["first_name"], data[0]["last_name"], fantasy_bc, "Valid data", ) # Invalid ABF _csv_upload_helper( self.manager, data[1]["system_number"], data[1]["first_name"], data[1]["last_name"], fantasy_bc, "Invalid ABF No", expect_to_fail=True, ) # Check Start and End Dates _csv_upload_helper( self.manager, data[2]["system_number"], data[2]["first_name"], data[2]["last_name"], fantasy_bc, "Check Start and End Dates", )