From e94ebf8d74adb251e8657b8670abb052c0bea7db Mon Sep 17 00:00:00 2001 From: RGilliard-Arch <150460521+RGilliard-Arch@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:06:15 -0400 Subject: [PATCH 1/6] Add budget csv; update docs where appropriate --- documentation/csv/budget.csv | 12 ++++++++++ documentation/csv/program.csv | 38 +++++++++++++++---------------- documentation/csv/question.csv | 24 +++++++++---------- documentation/csv/response.csv | 10 ++++---- documentation/source/database.rst | 7 ++++++ 5 files changed, 55 insertions(+), 36 deletions(-) create mode 100644 documentation/csv/budget.csv diff --git a/documentation/csv/budget.csv b/documentation/csv/budget.csv new file mode 100644 index 00000000..70facf00 --- /dev/null +++ b/documentation/csv/budget.csv @@ -0,0 +1,12 @@ +field," type" +reg,int +prg,varchar(2) +type,varchar(10) +state,varchar(10) +afm,varchar(3) +grant_number,varchar(20) +recipient_name,varchar(255) +year,int +quarter,int +metric,varchar(50) +value,numeric diff --git a/documentation/csv/program.csv b/documentation/csv/program.csv index d3e1cd0a..1f25d54b 100644 --- a/documentation/csv/program.csv +++ b/documentation/csv/program.csv @@ -1,19 +1,19 @@ -field, type -uid, varchar(255) -year, year -grantee_name, varchar(255) -grant_number, varchar(255) -program_address_line_1, varchar(255) -program_address_line_2, varchar(255) -program_agency_description, varchar(255) -program_agency_type, varchar(255) -program_city, varchar(255) -program_email, varchar(255) -program_name, varchar(255) -program_number, varchar(255) -program_phone, varchar(255) -program_type, varchar(255) -program_state, varchar(255) -program_zip1, varchar(255) -program_zip2, varchar(255) -region, int +field," type" +uid," varchar(255)" +year,int +grantee_name," varchar(255)" +grant_number," varchar(255)" +program_address_line_1," varchar(255)" +program_address_line_2," varchar(255)" +program_agency_description," varchar(255)" +program_agency_type," varchar(255)" +program_city," varchar(255)" +program_email," varchar(255)" +program_name," varchar(255)" +program_number," varchar(255)" +program_phone," varchar(255)" +program_type," varchar(255)" +program_state," varchar(255)" +program_zip1," varchar(255)" +program_zip2," varchar(255)" +region," int" diff --git a/documentation/csv/question.csv b/documentation/csv/question.csv index 2678536e..e162f831 100644 --- a/documentation/csv/question.csv +++ b/documentation/csv/question.csv @@ -1,12 +1,12 @@ -field, type -question_id, varchar(255) -year, year -uqid, varchar(255) -category, varchar(255) -question_name, text -question_number, varchar(255) -question_order, float -question_text, text -question_type, varchar(255) -section, varchar(255) -subsection, varchar(255) +field," type" +question_id," varchar(255)" +year,int +uqid," varchar(255)" +category," varchar(255)" +question_name," text" +question_number," varchar(255)" +question_order,numeric +question_text," text" +question_type," varchar(255)" +section," varchar(255)" +subsection," varchar(255)" diff --git a/documentation/csv/response.csv b/documentation/csv/response.csv index aec1b66c..dfd3a010 100644 --- a/documentation/csv/response.csv +++ b/documentation/csv/response.csv @@ -1,5 +1,5 @@ -field, type -uid, varchar(255) -question_id, varchar(255) -year, year -answer, text +field," type" +uid," varchar(255)" +question_id," varchar(255)" +year,int +answer," text" diff --git a/documentation/source/database.rst b/documentation/source/database.rst index 6277f8fe..2c1e6731 100644 --- a/documentation/source/database.rst +++ b/documentation/source/database.rst @@ -10,6 +10,13 @@ found in `workflow `__. Tables ------ +Budget +~~~~~~ + +.. csv-table:: + :file: ../csv/budget.csv + :header-rows: 1 + Question ~~~~~~~~ From a82a80aedb882183b6b3b996de88613913470e14 Mon Sep 17 00:00:00 2001 From: RGilliard-Arch <150460521+RGilliard-Arch@users.noreply.github.com> Date: Mon, 9 Jun 2025 10:09:05 -0400 Subject: [PATCH 2/6] Including budget data in PIR documentation --- documentation/PIR ERD.pptx | Bin 53096 -> 55450 bytes documentation/csv/PIR Data Dictionary.csv | 91 ++++++++++++---------- documentation/csv/budget.csv | 6 +- 3 files changed, 54 insertions(+), 43 deletions(-) diff --git a/documentation/PIR ERD.pptx b/documentation/PIR ERD.pptx index bd43a4f6ce074d759453796360d1b1c5832052e5..764bfd4d3d8eb0def7c1f8f3a307e335c432aed8 100644 GIT binary patch delta 24356 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 diff --git a/documentation/csv/PIR Data Dictionary.csv b/documentation/csv/PIR Data Dictionary.csv index 3da26cec..bfee66fe 100644 --- a/documentation/csv/PIR Data Dictionary.csv +++ b/documentation/csv/PIR Data Dictionary.csv @@ -1,40 +1,51 @@ -table, column, column_proper, description -response, uid, Unique Program ID,"Uniquely identifies each program within a year. Hash of grant_number, program_number, and program_type." -response, question_id, Question ID,"Uniquely identifies questions within a year. Hash of question_number, and question_name." -response, year, Year, Year from which question is drawn. -response, answer, Answer, Response to present question. -question, question_id, Question ID,"Uniquely identifies questions within a year. Hash of question_number, and question_name." -question, year, Year, Year from which question is drawn. -question, uqid, Unique Question ID, Uniquely identifies a question across years. -question, category, Category, Category of question. -question, question_name, Question Name, Name of question. -question, question_number, Question Number, Number of question. -question, question_order, Question Order, Order question appears in survey. -question, question_text, Question Text, Text of question. -question, question_type, Question Type, Type of question. -question, section, Section, Section in which question is found in survey. -question, subsection, Subsection, Subsection in which question is found in survey. -program, uid, Unique Program ID,"Uniquely identifies each program within a year. Hash of grant_number, program_number, and program_type. " -program, year, Year, Survey year. -program, grantee_name, Grantee Name, Name of grantee. -program, grant_number, Grant Number, Grant number. -program, program_address_line_1, Address Line 1, Line 1 of program address. -program, program_address_line_2, Address Line 2, Line 2 of program address. -program, program_agency_description, Agency Description, Description of agency/program. -program, program_agency_type, Agency Type, Type of program/agency. -program, program_city, City, City in which program is located. -program, program_email, Email, Program email address. -program, program_name, Name, Program name. -program, program_number, Number, Program number. -program, program_phone, Phone Number, Program phone number. -program, program_type, Type," Type of program (Early Head Start, Head Start etc.)" -program, program_state, State, State in which the program is located. -program, program_zip1, Zip 5, Five-digit zip code. -program, program_zip2, Zip 4, Additional four digits for nine-digit zip code. -program, region, Region, Region in which the program is located. -uqid_changelog, id, ID, Auto-incremented integer ID -uqid_changelog, question_id, Question ID, "Uniquely identifies questions within a year. Hash of question_number, and question_name." -uqid_changelog, original_uqid, Original Unique Question ID, "Original UQID, if any, of the target question" -uqid_changelog, new_uqid, New Unique Question ID, "New UQID, if any, of the target question" -uqid_changelog, timestamp, Timestamp, Auto-generated timestamp -uqid_changelog, complete_series_flag, Complete Series Flag, Indicator for whether this question should be marked as complete/confirmed +table, column, column_proper, description,, +response, uid, Unique Program ID,"Uniquely identifies each program within a year. Hash of grant_number, program_number, and program_type.",, +response, question_id, Question ID,"Uniquely identifies questions within a year. Hash of question_number, and question_name.",, +response, year, Year, Year from which question is drawn.,, +response, answer, Answer, Response to present question.,, +question, question_id, Question ID,"Uniquely identifies questions within a year. Hash of question_number, and question_name.",, +question, year, Year, Year from which question is drawn.,, +question, uqid, Unique Question ID, Uniquely identifies a question across years.,, +question, category, Category, Category of question.,, +question, question_name, Question Name, Name of question.,, +question, question_number, Question Number, Number of question.,, +question, question_order, Question Order, Order question appears in survey.,, +question, question_text, Question Text, Text of question.,, +question, question_type, Question Type, Type of question.,, +question, section, Section, Section in which question is found in survey.,, +question, subsection, Subsection, Subsection in which question is found in survey.,, +program, uid, Unique Program ID,"Uniquely identifies each program within a year. Hash of grant_number, program_number, and program_type. ",, +program, year, Year, Survey year.,, +program, grantee_name, Grantee Name, Name of grantee.,, +program, grant_number, Grant Number, Grant number.,, +program, program_address_line_1, Address Line 1, Line 1 of program address.,, +program, program_address_line_2, Address Line 2, Line 2 of program address.,, +program, program_agency_description, Agency Description, Description of agency/program.,, +program, program_agency_type, Agency Type, Type of program/agency.,, +program, program_city, City, City in which program is located.,, +program, program_email, Email, Program email address.,, +program, program_name, Name, Program name.,, +program, program_number, Number, Program number. ,, +program, program_phone, Phone Number, Program phone number.,, +program, program_type, Type," Type of program (Early Head Start, Head Start etc.)",, +program, program_state, State, State in which the program is located.,, +program, program_zip1, Zip 5, Five-digit zip code.,, +program, program_zip2, Zip 4, Additional four digits for nine-digit zip code.,, +program, region, Region, Region in which the program is located.,, +uqid_changelog, id, ID, Auto-incremented integer ID,, +uqid_changelog, question_id, Question ID," ""Uniquely identifies questions within a year. Hash of question_number"," and question_name.""", +uqid_changelog, original_uqid, Original Unique Question ID," ""Original UQID", if any," of the target question""" +uqid_changelog, new_uqid, New Unique Question ID," ""New UQID", if any," of the target question""" +uqid_changelog, timestamp, Timestamp, Auto-generated timestamp,, +uqid_changelog, complete_series_flag, Complete Series Flag, Indicator for whether this question should be marked as complete/confirmed,, +budget,region,Region,Region in which the program is located,, +budget,prg,Program,,, +budget,type,Type,,, +budget,program_state,Program State,State in which the program is located,, +budget,afm,,,, +budget,grant_number,Grant Number,Grant number.,, +budget,program_name,Program Name,Program name.,, +budget,year,Year,Fiscal year.,, +budget,quarter,Quarter,Fiscal quarter.,, +budget,metric,Metric,Reported metric.,, +budget,value,Value,Value of reported metric.,, diff --git a/documentation/csv/budget.csv b/documentation/csv/budget.csv index 70facf00..f5ec99bd 100644 --- a/documentation/csv/budget.csv +++ b/documentation/csv/budget.csv @@ -1,11 +1,11 @@ field," type" -reg,int +region,int prg,varchar(2) type,varchar(10) -state,varchar(10) +program_state,varchar(10) afm,varchar(3) grant_number,varchar(20) -recipient_name,varchar(255) +program_name,varchar(255) year,int quarter,int metric,varchar(50) From 9977fd5d7e739175fddc1ba948dcea35ca76c48e Mon Sep 17 00:00:00 2001 From: RGilliard-Arch <150460521+RGilliard-Arch@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:47:08 -0400 Subject: [PATCH 3/6] Correct PIR Data dictionary --- documentation/csv/PIR Data Dictionary.csv | 102 +++++++++++----------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/documentation/csv/PIR Data Dictionary.csv b/documentation/csv/PIR Data Dictionary.csv index bfee66fe..117c83ed 100644 --- a/documentation/csv/PIR Data Dictionary.csv +++ b/documentation/csv/PIR Data Dictionary.csv @@ -1,51 +1,51 @@ -table, column, column_proper, description,, -response, uid, Unique Program ID,"Uniquely identifies each program within a year. Hash of grant_number, program_number, and program_type.",, -response, question_id, Question ID,"Uniquely identifies questions within a year. Hash of question_number, and question_name.",, -response, year, Year, Year from which question is drawn.,, -response, answer, Answer, Response to present question.,, -question, question_id, Question ID,"Uniquely identifies questions within a year. Hash of question_number, and question_name.",, -question, year, Year, Year from which question is drawn.,, -question, uqid, Unique Question ID, Uniquely identifies a question across years.,, -question, category, Category, Category of question.,, -question, question_name, Question Name, Name of question.,, -question, question_number, Question Number, Number of question.,, -question, question_order, Question Order, Order question appears in survey.,, -question, question_text, Question Text, Text of question.,, -question, question_type, Question Type, Type of question.,, -question, section, Section, Section in which question is found in survey.,, -question, subsection, Subsection, Subsection in which question is found in survey.,, -program, uid, Unique Program ID,"Uniquely identifies each program within a year. Hash of grant_number, program_number, and program_type. ",, -program, year, Year, Survey year.,, -program, grantee_name, Grantee Name, Name of grantee.,, -program, grant_number, Grant Number, Grant number.,, -program, program_address_line_1, Address Line 1, Line 1 of program address.,, -program, program_address_line_2, Address Line 2, Line 2 of program address.,, -program, program_agency_description, Agency Description, Description of agency/program.,, -program, program_agency_type, Agency Type, Type of program/agency.,, -program, program_city, City, City in which program is located.,, -program, program_email, Email, Program email address.,, -program, program_name, Name, Program name.,, -program, program_number, Number, Program number. ,, -program, program_phone, Phone Number, Program phone number.,, -program, program_type, Type," Type of program (Early Head Start, Head Start etc.)",, -program, program_state, State, State in which the program is located.,, -program, program_zip1, Zip 5, Five-digit zip code.,, -program, program_zip2, Zip 4, Additional four digits for nine-digit zip code.,, -program, region, Region, Region in which the program is located.,, -uqid_changelog, id, ID, Auto-incremented integer ID,, -uqid_changelog, question_id, Question ID," ""Uniquely identifies questions within a year. Hash of question_number"," and question_name.""", -uqid_changelog, original_uqid, Original Unique Question ID," ""Original UQID", if any," of the target question""" -uqid_changelog, new_uqid, New Unique Question ID," ""New UQID", if any," of the target question""" -uqid_changelog, timestamp, Timestamp, Auto-generated timestamp,, -uqid_changelog, complete_series_flag, Complete Series Flag, Indicator for whether this question should be marked as complete/confirmed,, -budget,region,Region,Region in which the program is located,, -budget,prg,Program,,, -budget,type,Type,,, -budget,program_state,Program State,State in which the program is located,, -budget,afm,,,, -budget,grant_number,Grant Number,Grant number.,, -budget,program_name,Program Name,Program name.,, -budget,year,Year,Fiscal year.,, -budget,quarter,Quarter,Fiscal quarter.,, -budget,metric,Metric,Reported metric.,, -budget,value,Value,Value of reported metric.,, +table, column, column_proper, description +response, uid, Unique Program ID,"Uniquely identifies each program within a year. Hash of grant_number, program_number, and program_type." +response, question_id, Question ID,"Uniquely identifies questions within a year. Hash of question_number, and question_name." +response, year, Year,Year from which question is drawn. +response, answer, Answer,Response to present question. +question, question_id, Question ID,"Uniquely identifies questions within a year. Hash of question_number, and question_name." +question, year, Year,Year from which question is drawn. +question, uqid, Unique Question ID,Uniquely identifies a question across years. +question, category, Category, Category of question. +question, question_name, Question Name, Name of question. +question, question_number, Question Number, Number of question. +question, question_order, Question Order, Order question appears in survey. +question, question_text, Question Text, Text of question. +question, question_type, Question Type, Type of question. +question, section, Section, Section in which question is found in survey. +question, subsection, Subsection, Subsection in which question is found in survey. +program, uid, Unique Program ID,"Uniquely identifies each program within a year. Hash of grant_number, program_number, and program_type. " +program, year, Year, Survey year. +program, grantee_name, Grantee Name, Name of grantee. +program, grant_number, Grant Number, Grant number. +program, program_address_line_1, Address Line 1, Line 1 of program address. +program, program_address_line_2, Address Line 2, Line 2 of program address. +program, program_agency_description, Agency Description, Description of agency/program. +program, program_agency_type, Agency Type, Type of program/agency. +program, program_city, City, City in which program is located. +program, program_email, Email, Program email address. +program, program_name, Name, Program name. +program, program_number, Number, Program number. +program, program_phone, Phone Number, Program phone number. +program, program_type, Type," Type of program (Early Head Start, Head Start etc.)" +program, program_state, State, State in which the program is located. +program, program_zip1, Zip 5, Five-digit zip code. +program, program_zip2, Zip 4, Additional four digits for nine-digit zip code. +program, region, Region, Region in which the program is located. +uqid_changelog, id, ID, Auto-incremented integer ID +uqid_changelog, question_id, Question ID, Uniquely identifies questions within a year. Hash of question_number and question_name. +uqid_changelog, original_uqid, Original Unique Question ID, Original UQID if any of the target question +uqid_changelog, new_uqid, New Unique Question ID, New UQID if any of the target question +uqid_changelog, timestamp, Timestamp, Auto-generated timestamp +uqid_changelog, complete_series_flag, Complete Series Flag, Indicator for whether this question should be marked as complete/confirmed +budget,region,Region,Region in which the program is located +budget,prg,Program, +budget,type,Type, +budget,program_state,Program State,State in which the program is located +budget,afm,Annual Funding Month, +budget,grant_number,Grant Number,Grant number. +budget,program_name,Program Name,Program name. +budget,year,Year,Fiscal year. +budget,quarter,Quarter,Fiscal quarter. +budget,metric,Metric,Reported metric. +budget,value,Value,Value of reported metric. From ac4ff4d5ef322ef4b9675ea577163cc76bda7b6d Mon Sep 17 00:00:00 2001 From: RGilliard-ACF <238555752+RGilliard-ACF@users.noreply.github.com> Date: Sun, 25 Jan 2026 16:45:21 +0000 Subject: [PATCH 4/6] Code formatted with black --- code/uqid_bug_correction.py | 12 ++++-------- src/pir_pipeline/utils/SQLAlchemyUtils.py | 6 ++---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/code/uqid_bug_correction.py b/code/uqid_bug_correction.py index fdc61f8b..52631caa 100644 --- a/code/uqid_bug_correction.py +++ b/code/uqid_bug_correction.py @@ -155,13 +155,11 @@ def post_correction_checks( def add_unique_constraint(): - constraint_query = text( - """ + constraint_query = text(""" ALTER TABLE question ADD CONSTRAINT uq_question_uqid UNIQUE (uqid, year) - """ - ) + """) with SQL_UTILS.engine.begin() as conn: conn.execute(constraint_query) @@ -175,15 +173,13 @@ def revert_or_drop_temp_table(revert: bool = False): for column in QUESTION.c: if not column.primary_key: update_string.append(f"{column.name} = EXCLUDED.{column.name}") - query = text( - f""" + query = text(f""" INSERT INTO question SELECT * FROM question_temp ON CONFLICT ON CONSTRAINT pk_question DO UPDATE SET {', '.join(update_string)} - """ - ) + """) queries.insert(0, query) # Remove unique constraint. diff --git a/src/pir_pipeline/utils/SQLAlchemyUtils.py b/src/pir_pipeline/utils/SQLAlchemyUtils.py index 301cebe0..448473f2 100644 --- a/src/pir_pipeline/utils/SQLAlchemyUtils.py +++ b/src/pir_pipeline/utils/SQLAlchemyUtils.py @@ -165,13 +165,11 @@ def get_columns(self, table: str, where: str = "") -> list[str]: elif self._dialect == "postgresql": table_schema = "table_catalog" - query = text( - f""" + query = text(f""" SELECT column_name FROM information_schema.columns WHERE table_name = :table AND {table_schema} = :schema {where} - """ - ) + """) with self._engine.connect() as conn: result = conn.execute( query, {"table": table, "schema": self._database, "where": where} From 0104f01060b03cdcbef74e0f8008782c8059cd32 Mon Sep 17 00:00:00 2001 From: Gilliard Reggie Date: Sun, 25 Jan 2026 12:26:17 -0500 Subject: [PATCH 5/6] Tests: Correct tests --- tests/dashboard/conftest.py | 2 +- tests/dashboard/test_review_ui.py | 2 +- tests/dashboard/test_search_ui.py | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/dashboard/conftest.py b/tests/dashboard/conftest.py index 67ae08f4..ca3c1271 100644 --- a/tests/dashboard/conftest.py +++ b/tests/dashboard/conftest.py @@ -50,7 +50,7 @@ def runner(app): @pytest.fixture def driver(): options = Options() - options.add_argument("--headless") + # options.add_argument("--headless") driver = webdriver.Firefox(options=options) yield driver diff --git a/tests/dashboard/test_review_ui.py b/tests/dashboard/test_review_ui.py index 5634b049..7c37e681 100644 --- a/tests/dashboard/test_review_ui.py +++ b/tests/dashboard/test_review_ui.py @@ -50,7 +50,7 @@ def count_modal_rows(table: str): By.CSS_SELECTOR, "tr#flashcard-matches-table-tr-10000 td[name='question_id']", ).get_attribute("textContent") - == "0e93c25d3a95604f40d3a64e2298093b4faed6f2" + == "d27e8217ba30000a78e5d92ea54f4d9a2e69cb54" ) # Click the storeLink button in the first row diff --git a/tests/dashboard/test_search_ui.py b/tests/dashboard/test_search_ui.py index dbe7474a..acbb13cf 100644 --- a/tests/dashboard/test_search_ui.py +++ b/tests/dashboard/test_search_ui.py @@ -1,4 +1,5 @@ import os +import time import pytest from selenium.common.exceptions import TimeoutException @@ -65,8 +66,8 @@ def count_modal_rows(table: str): edit_button = wait.until( EC.element_to_be_clickable( ( - By.XPATH, - '//table[@id="search-results-table"]//button[@onclick="getFlashcardData(event)"]', + By.CSS_SELECTOR, + "tr[id='search-results-table-tr-10002'] button[onclick='getFlashcardData(event)']", ) ) ) @@ -164,4 +165,3 @@ def count_modal_rows(table: str): if __name__ == "__main__": pytest.main([__file__, "-sk", "test_search_ui"]) - pytest.main([__file__, "-sk", "test_search_ui"]) From c27a9303ea2d2b0da1f9a22affc13078511506f1 Mon Sep 17 00:00:00 2001 From: Gilliard Reggie Date: Mon, 26 Jan 2026 09:42:10 -0500 Subject: [PATCH 6/6] Correcting tests/requirements --- code/unit_tests.sh | 2 +- requirements.txt | 3 ++- tests/dashboard/conftest.py | 2 +- tests/dashboard/test_search.py | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/code/unit_tests.sh b/code/unit_tests.sh index 19cd1abe..0b3b2bf0 100644 --- a/code/unit_tests.sh +++ b/code/unit_tests.sh @@ -1,4 +1,4 @@ pip install -U pip -pip install . +pip install -r requirements.txt python3 -m pytest tests/ \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c5bac055..21602cf7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -29,7 +29,7 @@ openpyxl==3.1.5 outcome==1.3.0.post0 packaging==25.0 pandas==2.2.3 --e git+https://github.com/HHS/ACF-pir-data.git@101d4d438bdd301fd96fd88c4c4580ff902b9705#egg=pir_pipeline +-e git+https://github.com/HHS/ACF-pir-data.git@0104f01060b03cdcbef74e0f8008782c8059cd32#egg=pir_pipeline pluggy==1.5.0 psycopg==3.2.7 psycopg-binary==3.2.7 @@ -66,6 +66,7 @@ typing-inspection==0.4.0 typing_extensions==4.13.2 tzdata==2025.2 urllib3==2.4.0 +waitress==3.0.2 websocket-client==1.8.0 Werkzeug==3.1.3 wsproto==1.2.0 diff --git a/tests/dashboard/conftest.py b/tests/dashboard/conftest.py index ca3c1271..67ae08f4 100644 --- a/tests/dashboard/conftest.py +++ b/tests/dashboard/conftest.py @@ -50,7 +50,7 @@ def runner(app): @pytest.fixture def driver(): options = Options() - # options.add_argument("--headless") + options.add_argument("--headless") driver = webdriver.Firefox(options=options) yield driver diff --git a/tests/dashboard/test_search.py b/tests/dashboard/test_search.py index a89cd5cc..371d48ef 100644 --- a/tests/dashboard/test_search.py +++ b/tests/dashboard/test_search.py @@ -75,4 +75,4 @@ def test_post_data(self, client): if __name__ == "__main__": - pytest.main([__file__, "-sk", "test_post_data"]) + pytest.main([__file__, "-s", "-vv", "-k", "test_post_data"])