diff --git a/config.example.json b/config.example.json index 03e5a2e..06660ff 100644 --- a/config.example.json +++ b/config.example.json @@ -202,6 +202,48 @@ } } } + }, + "INTRADAY": { + "enabled": true, + "run_session": true, + "run_token": true, + "me_instance": "53", + "session": {}, + "token": { + "market_code": "NATIONAL", + "product_type": "INTRADAY", + "product_codes": [ + "I_DayStatic_C" + ], + "generation_mode": "Intraday24by7", + "delivery_start_offset_minutes": 5, + "trading_start_time": "00:20", + "trading_start_days_before_delivery": 1, + "duration_before_delivery_end_time": 150, + "delivery_to_time": "23:59" + } + }, + "DAC": { + "enabled": false, + "run_session": true, + "run_token": true, + "me_instance": "57", + "session": { + "time_mode": "offset", + "start_offset_minutes": 5, + "end_time": "23:00" + }, + "token": { + "market_code": "NATIONAL", + "product_type": "DAC", + "product_codes": ["DACStatic"], + "generation_mode": "DAC", + "delivery_start_offset_minutes": 5, + "delivery_to_time": "23:59", + "session_start_time": "13:00", + "session_end_time": "23:00", + "delivery_time_period": 15 + } } } } diff --git a/tests/locators.py b/tests/locators.py index 320b07a..3e8aa71 100644 --- a/tests/locators.py +++ b/tests/locators.py @@ -39,6 +39,16 @@ class Locator(object): tokendeliveryenddate = "//input[@placeholder='DELIVERY_END_DATE']" tokenexpirydate = "//input[@placeholder='Token Expiry Date']" tokentype = "//input[@name='TYPE' or @placeholder='TYPE']" + intradaydeliveryfromdate = "//input[@placeholder='Delivery From Date']" + intradaydeliverytodate = "//input[@placeholder='Delivery To Date']" + intradaytradingstarttime = "//input[@placeholder='Trading Start Time']" + intradaydaysbeforedelivery = "//input[@placeholder='Trading Start days before delivery']" + intradaydurationbeforeend = "//input[@placeholder='Duration before delivery end time']" + intradaysuccessmessage = "//*[contains(normalize-space(text()), 'Tokens generated successfully')]" + dactradingfromdate = "//input[@placeholder='Trading From Date']" + dactradingtodate = "//input[@placeholder='Trading To Date']" + dacsessionstarttime = "//input[@placeholder='Session Start Time']" + dacsessionendtime = "//input[@placeholder='Session End Time']" tokentradedate = "//input[@placeholder='Trade Date']" upcordernormalstart = "//input[@name='ses3StartTime']" upcordernormalend = "//input[@name='ses3EndTime']" diff --git a/tests/setup/tokens/test_trading_token.py b/tests/setup/tokens/test_trading_token.py index 3d1b86d..f557e2c 100644 --- a/tests/setup/tokens/test_trading_token.py +++ b/tests/setup/tokens/test_trading_token.py @@ -56,6 +56,15 @@ def get_delivery_date_and_expiry(token): return delivery_date, token_expiry +def get_intraday_delivery_window(token, now=None): + """Return an Intraday delivery window that cannot start in the past.""" + now = datetime.now() if now is None else now + start = now + timedelta(minutes=token.get("delivery_start_offset_minutes", 5)) + start_text = start.strftime("%d/%m/%Y %H:%M") + end_text = f"{start.strftime('%d/%m/%Y')} {token.get('delivery_to_time', '23:59')}" + return start_text, end_text + + def get_time_session_times(token, row_text, default_start_time, default_end_time): time_session_config = token.get("time_sessions", {}).get(row_text, {}) @@ -263,6 +272,76 @@ def create_rtm_token(driver, step, token): handle_transient_popups(driver) +def create_intraday_token(driver, step, token): + """Create an Intraday token through the Token Generator page.""" + open_trading_maintenance_page(driver, Locator.tokengenerator) + handle_transient_popups(driver) + step.capture("open_token_generator_intraday") + + for element_id, value, name in ( + (Locator.generatormarketcode, token["market_code"], "market_code"), + (Locator.generatorproductcode, token["product_code"], "product_code"), + (Locator.generatorgenerationmode, token["generation_mode"], "generation_mode"), + ): + select_bootstrap_dropdown_by_id(driver, element_id, value, exact=True) + step.capture(f"select_{name}_intraday") + + step.click((By.XPATH, Locator.addnewtokenbtn), "click_add_new_token_intraday") + + delivery_start, delivery_end = get_intraday_delivery_window(token) + values = ( + (Locator.intradaydeliveryfromdate, delivery_start, "delivery_from_date"), + (Locator.intradaydeliverytodate, delivery_end, "delivery_to_date"), + (Locator.intradaytradingstarttime, token.get("trading_start_time", "00:20"), "trading_start_time"), + (Locator.intradaydaysbeforedelivery, str(token.get("trading_start_days_before_delivery", 1)), "days_before_delivery"), + ) + for locator, value, name in values: + type_first_visible_input(driver, locator, value) + step.capture(f"enter_{name}_intraday") + + step.click((By.XPATH, Locator.savetokenbtn), "save_token_intraday") + WebDriverWait(driver, 30).until( + EC.visibility_of_element_located((By.XPATH, Locator.intradaysuccessmessage)) + ) + step.capture("intraday_token_generated_successfully") + handle_transient_popups(driver) + + +def create_dac_token(driver, step, token): + """Create a DAC token through the Token Generator page.""" + open_trading_maintenance_page(driver, Locator.tokengenerator) + handle_transient_popups(driver) + step.capture("open_token_generator_dac") + + for element_id, value, name in ( + (Locator.generatormarketcode, token["market_code"], "market_code"), + (Locator.generatorproductcode, token["product_code"], "product_code"), + (Locator.generatorgenerationmode, token["generation_mode"], "generation_mode"), + ): + select_bootstrap_dropdown_by_id(driver, element_id, value, exact=True) + step.capture(f"select_{name}_dac") + + step.click((By.XPATH, Locator.addnewtokenbtn), "click_add_new_token_dac") + + trading_start, trading_end = get_intraday_delivery_window(token) + values = ( + (Locator.dactradingfromdate, trading_start, "trading_from_date"), + (Locator.dactradingtodate, trading_end, "trading_to_date"), + (Locator.dacsessionstarttime, token.get("session_start_time", "13:00"), "session_start_time"), + (Locator.dacsessionendtime, token.get("session_end_time", "23:00"), "session_end_time"), + ) + for locator, value, name in values: + type_first_visible_input(driver, locator, value) + step.capture(f"enter_{name}_dac") + + step.click((By.XPATH, Locator.savetokenbtn), "save_token_dac") + WebDriverWait(driver, 30).until( + EC.visibility_of_element_located((By.XPATH, Locator.intradaysuccessmessage)) + ) + step.capture("dac_token_generated_successfully") + handle_transient_popups(driver) + + def create_upc_token(driver, step, token): open_trading_maintenance_page(driver, Locator.tokengenerator) handle_transient_popups(driver) @@ -290,6 +369,12 @@ def create_upc_token(driver, step, token): def run_token_setup(driver, step, token): + if token.get("product_type", "").upper() == "DAC": + create_dac_token(driver, step, token) + return + if token.get("product_type", "").upper() == "INTRADAY": + create_intraday_token(driver, step, token) + return if token.get("product_type", "").upper() == "UPC": create_upc_token(driver, step, token) return @@ -327,7 +412,11 @@ def create_and_activate_token(driver, step, token): step.click((By.XPATH, Locator.addnewtokenbtn), f"click_add_new_token_{product_code.lower()}") - next_day, token_expiry = get_delivery_date_and_expiry(token) + is_intraday = token.get("product_type", "").upper() == "INTRADAY" + if is_intraday: + delivery_start, delivery_end = get_intraday_delivery_window(token) + else: + next_day, token_expiry = get_delivery_date_and_expiry(token) if token.get("product_type", "").upper() == "REC": token_type_prefix = token.get("type_prefix", "REC") @@ -351,14 +440,17 @@ def create_and_activate_token(driver, step, token): continue type_first_visible_input(driver, locator, value) - if ( + if is_intraday: + step.type((By.XPATH, Locator.tokendeliverystartdate), delivery_start, f"enter_delivery_start_date_{product_code.lower()}") + step.type((By.XPATH, Locator.tokendeliveryenddate), delivery_end, f"enter_delivery_end_date_{product_code.lower()}") + elif ( token.get("generation_mode") not in ("WeeklyUPC", "MonthlyUPC") and token.get("product_type", "").upper() != "REC" ): step.type((By.XPATH, Locator.tokendeliverystartdate), next_day, f"enter_delivery_start_date_{product_code.lower()}") step.type((By.XPATH, Locator.tokendeliveryenddate), next_day, f"enter_delivery_end_date_{product_code.lower()}") - if token.get("generation_mode") not in ("WeeklyUPC", "MonthlyUPC"): + if not is_intraday and token.get("generation_mode") not in ("WeeklyUPC", "MonthlyUPC"): step.type((By.XPATH, Locator.tokenexpirydate), token_expiry, f"enter_token_expiry_date_{product_code.lower()}") step.click((By.XPATH, Locator.savetokenbtn), f"save_token_{product_code.lower()}") @@ -368,7 +460,8 @@ def create_and_activate_token(driver, step, token): step.click((By.XPATH, Locator.tokengeneratorresetbtn), f"reset_token_generator_{product_code.lower()}") return - complete_time_session_edits_from_saved_token(driver, step, token) + if not is_intraday: + complete_time_session_edits_from_saved_token(driver, step, token) @pytest.mark.trading_token