From a706b401b926aa7c386f08c135491703f7f0b3c6 Mon Sep 17 00:00:00 2001 From: Kial Jinnah Date: Thu, 28 May 2026 08:36:08 -0400 Subject: [PATCH 1/3] 33246 Legal API - use common account Signed-off-by: Kial Jinnah --- legal-api/poetry.lock | 39 ++- legal-api/pyproject.toml | 1 + legal-api/src/legal_api/config.py | 5 +- .../src/legal_api/reports/document_service.py | 2 +- .../resources/v2/business/business.py | 4 +- .../src/legal_api/resources/v2/namerequest.py | 6 +- .../scripts/document_service_import.py | 2 +- legal-api/src/legal_api/services/__init__.py | 3 +- legal-api/src/legal_api/services/bootstrap.py | 294 +----------------- legal-api/src/legal_api/services/colin.py | 2 +- .../validations/amalgamation_application.py | 4 +- .../filings/validations/common_validations.py | 2 +- .../services/involuntary_dissolution.py | 3 +- legal-api/src/legal_api/services/naics.py | 2 +- legal-api/src/legal_api/services/namex.py | 2 +- legal-api/tests/conftest.py | 6 + legal-api/tests/unit/core/test_filing.py | 4 +- .../tests/unit/core/test_filing_ledger.py | 2 +- legal-api/tests/unit/models/__init__.py | 3 +- .../unit/reports/test_document_service.py | 7 +- .../unit/reports/test_filing_report_url.py | 42 ++- legal-api/tests/unit/reports/test_report.py | 3 +- .../unit/resources/v2/test_name_requests.py | 6 +- .../test_validation_basic.py | 4 +- .../test_validation_directors_dates.py | 5 +- .../test_validation_effective_date.py | 4 +- .../filings/validations/test_alteration.py | 4 +- .../test_amalgamation_application.py | 10 +- .../test_incorporation_application.py | 2 +- .../filings/validations/test_registration.py | 2 +- .../services/test_involuntary_dissolution.py | 6 +- .../test_registraion_bootstrap_service.py | 2 +- .../business_checks/test_in_liquidation.py | 4 +- .../test_involuntary_dissolution.py | 2 +- 34 files changed, 115 insertions(+), 374 deletions(-) diff --git a/legal-api/poetry.lock b/legal-api/poetry.lock index f0473e2044..b6977a50fb 100644 --- a/legal-api/poetry.lock +++ b/legal-api/poetry.lock @@ -346,25 +346,52 @@ reference = "main" resolved_reference = "1d96ede7c8abd779b16dcbd93c0d04953bb6cdcb" subdirectory = "python/common/business-registry-model" +[[package]] +name = "business-registry-account" +version = "0.1.1" +description = "" +optional = false +python-versions = ">=3.13,<3.14" +groups = ["main"] +files = [] +develop = false + +[package.dependencies] +datedelta = ">=1.4,<2.0" +flask = ">=3.1.0,<4.0.0" +flask-jwt-oidc = ">=0.8.0,<1.0.0" +python-dotenv = ">=1.1.0,<2.0.0" +pytz = ">=2025.1,<2026.0" +requests = ">=2.32.3,<3.0.0" + +[package.source] +type = "git" +url = "https://github.com/bcgov/lear.git" +reference = "main" +resolved_reference = "5220da1a7f3cf74f112ae4fdc613c64e28cd356d" +subdirectory = "python/common/business-registry-account" + [[package]] name = "business-registry-common" -version = "0.1.0" +version = "0.1.1" description = "" optional = false -python-versions = ">=3.9,<4.0" +python-versions = ">=3.13,<3.14" groups = ["main"] files = [] develop = false [package.dependencies] -datedelta = "^1.4" -pytz = "^2025.1" +datedelta = ">=1.4,<2.0" +flask = ">=3.1.0,<4.0.0" +python-dateutil = ">=2.9.0,<3.0.0" +pytz = ">=2025.1,<2026.0" [package.source] type = "git" url = "https://github.com/bcgov/lear.git" reference = "main" -resolved_reference = "41558e130ff93aa1c32caada6f174e02b099b4f6" +resolved_reference = "ab74265227677d93896a8d9c85dd5bae6c617873" subdirectory = "python/common/business-registry-common" [[package]] @@ -4361,4 +4388,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.1" python-versions = ">=3.13,<3.14" -content-hash = "5495323f2113af19cb10adaf57a698649dfd65b4a024488952c6615fe1c30eff" +content-hash = "88090f7b4d497163f6a9e57131dc472e80b06a62f67e30a7a90f2a9df6dc4478" diff --git a/legal-api/pyproject.toml b/legal-api/pyproject.toml index a5f5ebdf92..346b2965f9 100644 --- a/legal-api/pyproject.toml +++ b/legal-api/pyproject.toml @@ -33,6 +33,7 @@ dependencies = [ "lxml (>=6.1.1)", "business-model @ git+https://github.com/bcgov/lear.git@main#subdirectory=python/common/business-registry-model", + "business-registry-account @ git+https://github.com/bcgov/lear.git@main#subdirectory=python/common/business-registry-account", "business-registry-common @ git+https://github.com/bcgov/lear.git@main#subdirectory=python/common/business-registry-common", "gcp-queue @ git+https://github.com/bcgov/sbc-connect-common.git@main#subdirectory=python/gcp-queue", "structured-logging @ git+https://github.com/bcgov/sbc-connect-common.git@main#subdirectory=python/structured-logging", diff --git a/legal-api/src/legal_api/config.py b/legal-api/src/legal_api/config.py index d7e584360e..2d7b748000 100644 --- a/legal-api/src/legal_api/config.py +++ b/legal-api/src/legal_api/config.py @@ -241,9 +241,6 @@ class TestConfig(_Config): # pylint: disable=too-few-public-methods f"postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}" ) - # URLs - AUTH_SVC_URL = os.getenv("AUTH_SVC_URL", "http://test-auth-url") - # Transparency Register - test cases set this explicitly as needed TR_START_DATE = "" @@ -316,6 +313,8 @@ class TestConfig(_Config): # pylint: disable=too-few-public-methods LEGAL_API_BASE_URL = "https://LEGAL_API_BASE_URL/api/v2/businesses" PAYMENT_SVC_URL = "https://PAY_SVC_URL/api/v1/payment-requests" + AUTH_SVC_URL = "https://AUTH_SVC_URL" + ACCOUNT_SVC_AUTH_URL = "https://ACCOUNT_SVC_AUTH_URL" BUSINESS_SCHEMA_ID = os.getenv("BUSINESS_SCHEMA_ID", "TEST_BUSINESS_SCHEMA_ID") BUSINESS_CRED_DEF_ID = os.getenv("BUSINESS_CRED_DEF_ID", "TEST_BUSINESS_SCHEMA_ID") diff --git a/legal-api/src/legal_api/reports/document_service.py b/legal-api/src/legal_api/reports/document_service.py index 3a49e795a5..62687909c0 100644 --- a/legal-api/src/legal_api/reports/document_service.py +++ b/legal-api/src/legal_api/reports/document_service.py @@ -16,11 +16,11 @@ import requests from flask import current_app, jsonify +from business_account import AccountService from business_common.utils.base import BaseEnum from business_model.models import Business, Document, Filing from legal_api.core.meta.filing import FILINGS from legal_api.exceptions import BusinessException -from legal_api.services import AccountService BUSINESS_DOCS_PATH: str = "{url}/application-reports/history/{product}/{business_id}?includeDocuments=true" GET_REPORT_PATH: str = "{url}/application-reports/{product}/{drsId}" diff --git a/legal-api/src/legal_api/resources/v2/business/business.py b/legal-api/src/legal_api/resources/v2/business/business.py index 45ec932ba0..7d1f72630d 100644 --- a/legal-api/src/legal_api/resources/v2/business/business.py +++ b/legal-api/src/legal_api/resources/v2/business/business.py @@ -22,13 +22,13 @@ from flask_babel import _ as babel from flask_cors import cross_origin +from business_account import AccountService from business_model.models import Business, Filing, RegistrationBootstrap from legal_api.core import Filing as CoreFiling from legal_api.resources.v2.business.business_filings import saving_filings from legal_api.services import ( ACCOUNT_IDENTITY, SYSTEM_ROLE, - AccountService, RegistrationBootstrapService, check_warnings, flags, @@ -92,7 +92,7 @@ def get_businesses(identifier: str): q_account = request.args.get("account") current_app.logger.info("account info request, for account: %s", q_account) if q_account and jwt.has_one_of_roles([SYSTEM_ROLE, ACCOUNT_IDENTITY]): - account_response = AccountService.get_account_by_affiliated_identifier(identifier) + account_response = AccountService.get_account_by_affiliated_identifier(identifier, flags) current_app.logger.info("VALID account request, for accountId: %s, by: %s, jwt: %s, for org account: %s", q_account, g.jwt_oidc_token_info.get("preferred_username"), diff --git a/legal-api/src/legal_api/resources/v2/namerequest.py b/legal-api/src/legal_api/resources/v2/namerequest.py index fff4ece328..0bbb5ba524 100644 --- a/legal-api/src/legal_api/resources/v2/namerequest.py +++ b/legal-api/src/legal_api/resources/v2/namerequest.py @@ -20,8 +20,8 @@ from flask import Blueprint, current_app, jsonify, make_response, request from flask_cors import cross_origin -from legal_api.services import namex -from legal_api.services.bootstrap import AccountService +from business_account import AccountService +from legal_api.services import namex, flags from legal_api.services.permissions import ListActionsPermissionsAllowed, PermissionService from legal_api.utils.auth import jwt from legal_api.utils.formatting import normalize_phone @@ -52,7 +52,7 @@ def validate_with_contact_info(identifier): # noqa: PLR0911 return jsonify(nr_json) # Check the NR is affiliated with this account - orgs_response = AccountService.get_account_by_affiliated_identifier(identifier) + orgs_response = AccountService.get_account_by_affiliated_identifier(identifier, flags) # If affiliated with the account, return the NR if len(orgs_response["orgs"]): diff --git a/legal-api/src/legal_api/scripts/document_service_import.py b/legal-api/src/legal_api/scripts/document_service_import.py index f6cf351a4f..a754448232 100644 --- a/legal-api/src/legal_api/scripts/document_service_import.py +++ b/legal-api/src/legal_api/scripts/document_service_import.py @@ -21,11 +21,11 @@ import requests from flask import Blueprint, current_app +from business_account import AccountService from business_model.models import Filing, db from business_model.models.business import Business from business_model.models.colin_event_id import ColinEventId from business_model.models.document import Document -from legal_api.services import AccountService document_service_bp = Blueprint("document_service", __name__) diff --git a/legal-api/src/legal_api/services/__init__.py b/legal-api/src/legal_api/services/__init__.py index 59736eeb05..667bdb31fb 100644 --- a/legal-api/src/legal_api/services/__init__.py +++ b/legal-api/src/legal_api/services/__init__.py @@ -33,7 +33,7 @@ authorized, has_roles, ) -from .bootstrap import AccountService, RegistrationBootstrapService +from .bootstrap import RegistrationBootstrapService from .business_details_version import VersionedBusinessDetailsService from .colin import ColinService from .digital_credentials import DigitalCredentialsService @@ -64,7 +64,6 @@ "authorized", "has_roles", # Services - "AccountService", "RegistrationBootstrapService", "VersionedBusinessDetailsService", "ColinService", diff --git a/legal-api/src/legal_api/services/bootstrap.py b/legal-api/src/legal_api/services/bootstrap.py index 9c15035c3f..3564b50ef1 100644 --- a/legal-api/src/legal_api/services/bootstrap.py +++ b/legal-api/src/legal_api/services/bootstrap.py @@ -14,19 +14,16 @@ """This is a service to bootstrap the Incorporation Application process.""" import contextlib -import json import secrets import string from http import HTTPStatus -import requests -from flask import current_app, has_request_context from flask_babel import _ as babel from sqlalchemy.orm.exc import FlushError +from business_account import AccountService from business_model.models import RegistrationBootstrap -from legal_api.services import Flags, flags -from legal_api.utils.auth import jwt +from legal_api.services import flags class RegistrationBootstrapService: @@ -109,290 +106,3 @@ def deregister_bootstrap(bootstrap: RegistrationBootstrap) -> HTTPStatus: affiliation_status = AccountService.delete_affiliation(account=bootstrap.account, business_registration=bootstrap.identifier) return affiliation_status - - -class AccountService: - """Wrapper to call Authentication Services. - - @TODO Cache and refresh / retry token as needed to reduce calls. - """ - - BEARER: str = "Bearer " - CONTENT_TYPE_JSON = {"Content-Type": "application/json"} - - try: - timeout = int(current_app.config.get("ACCOUNT_SVC_TIMEOUT", 20)) - except Exception: - timeout = 20 - - @classmethod - def get_bearer_token(cls): - """Get a valid Bearer token for the service to use.""" - token_url = current_app.config.get("ACCOUNT_SVC_AUTH_URL") - client_id = current_app.config.get("ACCOUNT_SVC_CLIENT_ID") - client_secret = current_app.config.get("ACCOUNT_SVC_CLIENT_SECRET") - - data = "grant_type=client_credentials" - - # get service account token - res = requests.post(url=token_url, - data=data, - headers={"content-type": "application/x-www-form-urlencoded"}, - auth=(client_id, client_secret), - timeout=cls.timeout) - - try: - return res.json().get("access_token") - except Exception: - return None - - @classmethod - def create_affiliation(cls, account: int, # noqa: PLR0913 - business_registration: str, - business_name: str | None = None, - corp_type_code: str = "TMP", - corp_sub_type_code: str | None = None, - pass_code: str = "", - details: dict | None = None, - flags: Flags | None = None): - """Affiliate a business to an account.""" - current_app.logger.info(f"Creating affiliation of {business_registration} for {account}") - auth_url = current_app.config.get("AUTH_SVC_URL") - account_svc_entity_url = f"{auth_url}/entities" - account_svc_affiliate_url = f"{auth_url}/orgs/{account}/affiliations" - - token = cls.get_bearer_token() - - if not token: - current_app.logger.info("Missing token for affiliation call") - return HTTPStatus.UNAUTHORIZED - - # Create an entity record - entity_data = { - "businessIdentifier": business_registration, - "corpTypeCode": corp_type_code, - "name": business_name or business_registration - } - if corp_sub_type_code: - entity_data["corpSubTypeCode"] = corp_sub_type_code - - entity_record = requests.post( - url=account_svc_entity_url, - headers={**cls.CONTENT_TYPE_JSON, - "Authorization": cls.BEARER + token}, - data=json.dumps(entity_data), - timeout=cls.timeout - ) - - # Create an account:business affiliation - # headers with conditional sandbox override - headers = {**cls.CONTENT_TYPE_JSON, "Authorization": cls.BEARER + token} - if flags and isinstance(flags, Flags) and flags.is_on("enable-sandbox"): - current_app.logger.info("Appending Environment-Override = sandbox header to create affiliation call") - headers["Environment-Override"] = "sandbox" - - affiliate_data = { - "businessIdentifier": business_registration, - "passCode": pass_code - } - if details: - affiliate_data["entityDetails"] = details - affiliate = requests.post( - url=account_svc_affiliate_url, - headers=headers, - data=json.dumps(affiliate_data), - timeout=cls.timeout - ) - - # @TODO delete affiliation and entity record next sprint when affiliation service is updated - if affiliate.status_code != HTTPStatus.CREATED or entity_record.status_code != HTTPStatus.CREATED: - return HTTPStatus.BAD_REQUEST - return HTTPStatus.OK - - @classmethod - def update_entity(cls, - business_registration: str, - business_name: str, - corp_type_code: str, - state: str | None = None): - """Update an entity.""" - auth_url = current_app.config.get("AUTH_SVC_URL") - account_svc_entity_url = f"{auth_url}/entities" - - token = cls.get_bearer_token() - - if not token: - return HTTPStatus.UNAUTHORIZED - - # Create an entity record - entity_data = { - "businessIdentifier": business_registration, - "corpTypeCode": corp_type_code, - "name": business_name - } - if state: - entity_data["state"] = state - - entity_record = requests.patch( - url=account_svc_entity_url + "/" + business_registration, - headers={**cls.CONTENT_TYPE_JSON, - "Authorization": cls.BEARER + token}, - data=json.dumps(entity_data), - timeout=cls.timeout - ) - - if entity_record.status_code != HTTPStatus.OK: - return HTTPStatus.BAD_REQUEST - return HTTPStatus.OK - - @classmethod - def delete_affiliation(cls, account: int, business_registration: str) -> dict: - """Affiliate a business to an account. - - @TODO Update this when account affiliation is changed next sprint. - """ - current_app.logger.info(f"Deleting affiliation of {business_registration} for {account}") - auth_url = current_app.config.get("AUTH_SVC_URL") - account_svc_entity_url = f"{auth_url}/entities" - account_svc_affiliate_url = f"{auth_url}/orgs/{account}/affiliations" - - token = cls.get_bearer_token() - - # Delete an account:business affiliation - affiliate = requests.delete( - url=account_svc_affiliate_url + "/" + business_registration, - headers={**cls.CONTENT_TYPE_JSON, - "Authorization": cls.BEARER + token}, - timeout=cls.timeout - ) - # Delete an entity record - entity_record = requests.delete( - url=account_svc_entity_url + "/" + business_registration, - headers={**cls.CONTENT_TYPE_JSON, - "Authorization": cls.BEARER + token}, - timeout=cls.timeout - ) - - if affiliate.status_code != HTTPStatus.OK \ - or entity_record.status_code not in (HTTPStatus.OK, HTTPStatus.NO_CONTENT): - return HTTPStatus.BAD_REQUEST - return HTTPStatus.OK - - @classmethod - def get_account_by_affiliated_identifier(cls, identifier: str): - """Return the account affiliated to the business.""" - token = cls.get_bearer_token() - auth_url = current_app.config.get("AUTH_SVC_URL") - url = f"{auth_url}/orgs?affiliation={identifier}" - - # headers with conditional sandbox override - headers = {**cls.CONTENT_TYPE_JSON, "Authorization": cls.BEARER + token} - if flags and isinstance(flags, Flags) and flags.is_on("enable-sandbox"): - current_app.logger.info("Appending Environment-Override = sandbox header to get account affiliation info") - headers["Environment-Override"] = "sandbox" - res = requests.get(url=url, headers=headers) - try: - return res.json() - except Exception: - current_app.logger.error("Failed to get response") - return None - - @classmethod - def get_affiliations(cls, account: int): - """Affiliate a business to an account.""" - auth_url = current_app.config.get("AUTH_SVC_URL") - account_svc_affiliate_url = f"{auth_url}/orgs/{account}/affiliations" - - token = cls.get_bearer_token() - - if not token: - current_app.logger.error("Not Authorized") - return None - - affiliates = requests.get( - url=account_svc_affiliate_url, - headers={**cls.CONTENT_TYPE_JSON, - "Authorization": cls.BEARER + token}, - timeout=cls.timeout - ) - - if affiliates.status_code == HTTPStatus.OK: - return affiliates.json().get("entities") - - return None - - @classmethod - def get_contacts(cls, config, org_id: str, user_token: str | None = None): - """Get contacts for the business. - Fetch Completing Party Details from Auth API. - - GET /orgs/{org_id}/memeberships for user contacts details - - GET /orgs/{org_id} for org contacts details - """ - token = cls.get_bearer_token() - auth_url = current_app.config.get("AUTH_SVC_URL") - - - if user_token: - token = user_token - elif has_request_context(): - try: - token = jwt.get_token_auth_header() - except Exception: - token = cls.get_bearer_token() - - else: - token = cls.get_bearer_token() - - user_response = requests.get( - url=f"{auth_url}/users/@me", - headers={**cls.CONTENT_TYPE_JSON, - "Authorization": cls.BEARER + token}, - timeout=cls.timeout - ) - - org_info_response = requests.get( - url=f"{auth_url}/orgs/{org_id}", - headers={**cls.CONTENT_TYPE_JSON, - "Authorization": cls.BEARER + token}, - timeout=cls.timeout - ) - - if user_response.status_code != HTTPStatus.OK or org_info_response.status_code != HTTPStatus.OK: - return None - - try: - user_data = user_response.json() - org_info = org_info_response.json() - - first_name = user_data.get("firstname", "") - last_name = user_data.get("lastname", "") - - user_contacts = user_data.get("contacts", []) - email = "" - if user_contacts and len(user_contacts) > 0 and user_contacts[0].get("email"): - # BCSC - email = user_contacts[0].get("email", "") - elif user_data.get("email"): - # IDIR - email = user_data.get("email", "") - - mailing_address = org_info.get("mailingAddress", {}) - if not mailing_address: - current_app.logger.warning(f"No mailing address found for org {org_id}") - mailing_address = {} - contact = { - "street": mailing_address.get("street", ""), - "city": mailing_address.get("city", ""), - "region": mailing_address.get("region", ""), - "country": mailing_address.get("country", ""), - "postalCode": mailing_address.get("postalCode", ""), - "firstName": first_name, - "lastName": last_name, - "email": email, - "streetAdditional": mailing_address.get("streetAdditional", ""), - "deliveryInstructions": mailing_address.get("deliveryInstructions", "") - } - return {"contacts": [contact]} - except Exception as e: - current_app.logger.error(f"Error fetching contacts: {e}") - return None \ No newline at end of file diff --git a/legal-api/src/legal_api/services/colin.py b/legal-api/src/legal_api/services/colin.py index 6c2f13176a..7578700018 100644 --- a/legal-api/src/legal_api/services/colin.py +++ b/legal-api/src/legal_api/services/colin.py @@ -16,7 +16,7 @@ import requests from flask import current_app -from legal_api.services.bootstrap import AccountService +from business_account import AccountService class ColinService: diff --git a/legal-api/src/legal_api/services/filings/validations/amalgamation_application.py b/legal-api/src/legal_api/services/filings/validations/amalgamation_application.py index f0d54a85d2..8fbd895d58 100644 --- a/legal-api/src/legal_api/services/filings/validations/amalgamation_application.py +++ b/legal-api/src/legal_api/services/filings/validations/amalgamation_application.py @@ -18,10 +18,10 @@ from flask.globals import request_ctx from flask_babel import _ as babel +from business_account import AccountService from business_model.models import AmalgamatingBusiness, Amalgamation, Business, Filing, PartyRole from legal_api.errors import Error from legal_api.services import STAFF_ROLE, flags -from legal_api.services.bootstrap import AccountService from legal_api.services.filings.validations.common_validations import ( validate_court_order, validate_effective_date, @@ -435,7 +435,7 @@ def _validate_amalgamation_type( # pylint: disable=too-many-arguments def _is_business_affliated(identifier, account_id): return bool( - (account_response := AccountService.get_account_by_affiliated_identifier(identifier)) and + (account_response := AccountService.get_account_by_affiliated_identifier(identifier, flags)) and (orgs := account_response.get("orgs")) and any(str(org.get("id")) == account_id for org in orgs) ) diff --git a/legal-api/src/legal_api/services/filings/validations/common_validations.py b/legal-api/src/legal_api/services/filings/validations/common_validations.py index 0441d6781a..ccbbaacd8b 100644 --- a/legal-api/src/legal_api/services/filings/validations/common_validations.py +++ b/legal-api/src/legal_api/services/filings/validations/common_validations.py @@ -23,6 +23,7 @@ from flask_babel import _ from pypdf import PdfReader +from business_account import AccountService from business_common.utils.datetime import date from business_common.utils.datetime import datetime as dt from business_common.utils.legislation_datetime import LegislationDatetime @@ -31,7 +32,6 @@ from legal_api.core.filing import Filing as CoreFiling from legal_api.errors import Error from legal_api.services import MinioService, colin, flags, namex -from legal_api.services.bootstrap import AccountService from legal_api.services.permissions import ListActionsPermissionsAllowed, PermissionService from legal_api.services.request_context import get_request_context from legal_api.services.utils import get_str diff --git a/legal-api/src/legal_api/services/involuntary_dissolution.py b/legal-api/src/legal_api/services/involuntary_dissolution.py index affae24f58..7711733b3d 100644 --- a/legal-api/src/legal_api/services/involuntary_dissolution.py +++ b/legal-api/src/legal_api/services/involuntary_dissolution.py @@ -19,11 +19,10 @@ from sqlalchemy import and_, exists, func, not_, or_, select, text from sqlalchemy.orm import aliased +from business_account import AccountService from business_model.models import Batch, BatchProcessing, Business, Filing, db from legal_api.services.request_context import get_request_context -from .bootstrap import AccountService - class InvoluntaryDissolutionService: """Provides services to get information for involuntary dissolution.""" diff --git a/legal-api/src/legal_api/services/naics.py b/legal-api/src/legal_api/services/naics.py index 92b94c893c..d6e495d6c6 100644 --- a/legal-api/src/legal_api/services/naics.py +++ b/legal-api/src/legal_api/services/naics.py @@ -18,7 +18,7 @@ import requests from flask import current_app -from legal_api.services.bootstrap import AccountService +from business_account import AccountService class NaicsService: diff --git a/legal-api/src/legal_api/services/namex.py b/legal-api/src/legal_api/services/namex.py index 78d16c9aef..1b78a96cd8 100644 --- a/legal-api/src/legal_api/services/namex.py +++ b/legal-api/src/legal_api/services/namex.py @@ -22,8 +22,8 @@ import requests from flask import current_app +from business_account import AccountService from business_model.models import Filing -from legal_api.services.bootstrap import AccountService from .utils import get_str diff --git a/legal-api/tests/conftest.py b/legal-api/tests/conftest.py index f817c0e0f3..060396bdde 100644 --- a/legal-api/tests/conftest.py +++ b/legal-api/tests/conftest.py @@ -278,6 +278,12 @@ def _mock_get_side_effect(request, context): yield minio_mock +@pytest.fixture(scope="function") +def mock_bearer_token(app, requests_mock): + token_mock = requests_mock.post(app.config.get("ACCOUNT_SVC_AUTH_URL"), json={"access_token": "mock-token"}) + return token_mock + + DOCUMENT_API_URL = 'http://document-api.com' DOCUMENT_API_VERSION = '/api/v1' DOCUMENT_SVC_URL = f'{DOCUMENT_API_URL + DOCUMENT_API_VERSION}' diff --git a/legal-api/tests/unit/core/test_filing.py b/legal-api/tests/unit/core/test_filing.py index 595f172080..8d7191894e 100644 --- a/legal-api/tests/unit/core/test_filing.py +++ b/legal-api/tests/unit/core/test_filing.py @@ -13,11 +13,13 @@ # limitations under the License. """Tests to assure the Filing Domain is working as expected.""" +from datetime import timezone + import datedelta from freezegun import freeze_time from registry_schemas.example_data import ANNUAL_REPORT -from business_common.utils.datetime import datetime, timezone +from business_common.utils import datetime from legal_api.core import Filing from tests.unit.models import factory_business, factory_completed_filing diff --git a/legal-api/tests/unit/core/test_filing_ledger.py b/legal-api/tests/unit/core/test_filing_ledger.py index b7c9199b1a..17049d7499 100644 --- a/legal-api/tests/unit/core/test_filing_ledger.py +++ b/legal-api/tests/unit/core/test_filing_ledger.py @@ -18,7 +18,7 @@ import datedelta from registry_schemas.example_data import FILING_TEMPLATE -from business_common.utils.datetime import datetime +from business_common.utils import datetime from business_model.models import Business, Comment, Filing from legal_api.core import Filing as CoreFiling from legal_api.services.authz import STAFF_ROLE diff --git a/legal-api/tests/unit/models/__init__.py b/legal-api/tests/unit/models/__init__.py index 312e027739..a090da6056 100644 --- a/legal-api/tests/unit/models/__init__.py +++ b/legal-api/tests/unit/models/__init__.py @@ -15,12 +15,13 @@ """The Test-Suite used to ensure that the Model objects are working correctly.""" import base64 import uuid +from datetime import timezone from datedelta import datedelta from freezegun import freeze_time from registry_schemas.example_data import ANNUAL_REPORT -from business_common.utils.datetime import datetime, timezone +from business_common.utils import datetime from business_common.utils.legislation_datetime import LegislationDatetime from business_model.models import ( Address, diff --git a/legal-api/tests/unit/reports/test_document_service.py b/legal-api/tests/unit/reports/test_document_service.py index b6eb9807bb..0b900fe97d 100644 --- a/legal-api/tests/unit/reports/test_document_service.py +++ b/legal-api/tests/unit/reports/test_document_service.py @@ -362,8 +362,7 @@ def test_update_ledger_docs(session, desc, doc_data, drs_data, receipt, filing, assert text_results.find(static) > 0 -def test_create_document(session, mock_doc_service, mocker): - mocker.patch('legal_api.services.AccountService.get_bearer_token', return_value='') +def test_create_document(app, session, mock_bearer_token, mock_doc_service): founding_date = datetime.now(UTC) business = factory_business('CP1234567', founding_date=founding_date) filing = copy.deepcopy(FILING_TEMPLATE) @@ -379,8 +378,8 @@ def test_create_document(session, mock_doc_service, mocker): assert document_service.has_document(completed_filing.id, 'annualReport') != False -def test_get_document(session, mock_doc_service, mocker): - mocker.patch('legal_api.services.AccountService.get_bearer_token', return_value='') +def test_get_document(app, session, mock_bearer_token, mock_doc_service): + # mocker.patch("legal_api.reports.document_service.AccountService.get_bearer_token", json={"access_token": "fake-token"}) founding_date = datetime.now(UTC) business = factory_business('CP1234567', founding_date=founding_date) filing = copy.deepcopy(FILING_TEMPLATE) diff --git a/legal-api/tests/unit/reports/test_filing_report_url.py b/legal-api/tests/unit/reports/test_filing_report_url.py index 405d10da81..4848643174 100644 --- a/legal-api/tests/unit/reports/test_filing_report_url.py +++ b/legal-api/tests/unit/reports/test_filing_report_url.py @@ -1,7 +1,7 @@ import pytest -import requests_mock from flask import current_app + from legal_api.reports.document_service import DocumentService, ReportTypes @pytest.mark.parametrize('report_type, expected_certified', [ @@ -18,34 +18,32 @@ # Receipts are financial records and should not be stamped with a "Certified Copy" watermark. (ReportTypes.RECEIPT.value, False), ]) -def test_get_filing_report_url_params(app, mocker, report_type, expected_certified): +def test_get_filing_report_url_params(app, mock_bearer_token, requests_mock, report_type, expected_certified): """ Verify that the Document Service correctly decides whether to request a 'Certified Copy'. This is critical because the downstream Document Retrieval Service (DRS) uses the 'certifiedCopy' query parameter to burn a permanent watermark into the PDF binary. """ - mocker.patch('legal_api.services.AccountService.get_bearer_token', return_value='fake-token') with app.app_context(): doc_service = DocumentService() drs_id = "test-drs-id" - with requests_mock.Mocker() as m: - base_url = current_app.config.get("DOCUMENT_SVC_URL").replace("/documents", "") - product = current_app.config.get("DOCUMENT_PRODUCT_CODE") - - # Construct the expected URL based on the logic we are testing - if expected_certified: - expected_url = f"{base_url}/application-reports/{product}/{drs_id}?certifiedCopy=true" - else: - expected_url = f"{base_url}/application-reports/{product}/{drs_id}" - - m.get(expected_url, status_code=200, content=b"pdf-binary-data") - - response = doc_service.get_filing_report(drs_id, report_type) - - # Verification: - # 1. The service reached the correct endpoint with the correct parameters - assert m.request_history[-1].url == expected_url - # 2. The binary data is returned correctly regardless of the stamp status - assert response.content == b"pdf-binary-data" + base_url = current_app.config.get("DOCUMENT_SVC_URL").replace("/documents", "") + product = current_app.config.get("DOCUMENT_PRODUCT_CODE") + + # Construct the expected URL based on the logic we are testing + if expected_certified: + expected_url = f"{base_url}/application-reports/{product}/{drs_id}?certifiedCopy=true" + else: + expected_url = f"{base_url}/application-reports/{product}/{drs_id}" + + m = requests_mock.get(expected_url, status_code=200, content=b"pdf-binary-data") + + response = doc_service.get_filing_report(drs_id, report_type) + + # Verification: + # 1. The service reached the correct endpoint with the correct parameters + assert m.request_history[-1].url == expected_url + # 2. The binary data is returned correctly regardless of the stamp status + assert response.content == b"pdf-binary-data" diff --git a/legal-api/tests/unit/reports/test_report.py b/legal-api/tests/unit/reports/test_report.py index be550f737d..5fc09d95e7 100644 --- a/legal-api/tests/unit/reports/test_report.py +++ b/legal-api/tests/unit/reports/test_report.py @@ -398,8 +398,7 @@ def test_notice_of_withdraw_format_data(session, test_name, identifier, entity_t assert formatted_now_json['noticeOfWithdrawal']['filingId'] == withdrawn_filing_id -def test_document_service_not_create_document(session, mock_doc_service, mocker): - mocker.patch('legal_api.services.AccountService.get_bearer_token', return_value='') +def test_document_service_not_create_document(session, mock_doc_service, mock_bearer_token): filing = copy.deepcopy(INCORPORATION_FILING_TEMPLATE) report = create_report(identifier='BC9999999', entity_type='BC', report_type='annualReport', filing_type='incorporationApplication', template=filing) diff --git a/legal-api/tests/unit/resources/v2/test_name_requests.py b/legal-api/tests/unit/resources/v2/test_name_requests.py index dd3e72ea23..7625c508bd 100644 --- a/legal-api/tests/unit/resources/v2/test_name_requests.py +++ b/legal-api/tests/unit/resources/v2/test_name_requests.py @@ -370,7 +370,7 @@ def test_nr_success_public_user(session, mocker, client, jwt): 'query_nr_number', return_value=MagicMock(status_code=200, json=MagicMock(return_value=nr_approved))): - mocker.patch('legal_api.services.bootstrap.AccountService.get_account_by_affiliated_identifier', + mocker.patch('legal_api.resources.v2.namerequest.AccountService.get_account_by_affiliated_identifier', return_value={'orgs': [{'id': 123456}]}) rv = client.get('/api/v2/nameRequests/NR 1234567/validate', headers=create_header(jwt, [UserRoles.public_user])) @@ -383,7 +383,7 @@ def test_nr_not_affiliated_public_user(session, mocker, client, jwt): 'query_nr_number', return_value=MagicMock(status_code=200, json=MagicMock(return_value=nr_approved_no_contact_info))): - mocker.patch('legal_api.services.bootstrap.AccountService.get_account_by_affiliated_identifier', + mocker.patch('legal_api.resources.v2.namerequest.AccountService.get_account_by_affiliated_identifier', return_value={'orgs': []}) rv = client.get('/api/v2/nameRequests/NR 1234567/validate', headers=create_header(jwt, [UserRoles.public_user])) @@ -396,7 +396,7 @@ def test_nr_valid_contact_public_user(session, mocker, client, jwt): 'query_nr_number', return_value=MagicMock(status_code=200, json=MagicMock(return_value=nr_approved))): - mocker.patch('legal_api.services.bootstrap.AccountService.get_account_by_affiliated_identifier', + mocker.patch('legal_api.resources.v2.namerequest.AccountService.get_account_by_affiliated_identifier', return_value={'orgs': []}) rv = client.get( '/api/v2/nameRequests/NR 1234567/validate', diff --git a/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_basic.py b/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_basic.py index c0d59d1d56..a0514f5c2f 100644 --- a/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_basic.py +++ b/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_basic.py @@ -13,14 +13,14 @@ # limitations under the License. """Test Change of Director basic validations.""" import copy +from datetime import timezone from http import HTTPStatus import datedelta import pytest from freezegun import freeze_time -from business_common.utils.datetime import datetime, timezone -from business_common.utils.legislation_datetime import LegislationDatetime +from business_common.utils import LegislationDatetime, datetime from business_model.models import Business from legal_api.services.filings import validate from tests.unit.services.filings.validations import lists_are_equal diff --git a/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_directors_dates.py b/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_directors_dates.py index 16342e93e7..1af98a45e3 100644 --- a/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_directors_dates.py +++ b/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_directors_dates.py @@ -12,16 +12,15 @@ # See the License for the specific language governing permissions and # limitations under the License. """Test Change of Director director date validations. See rules in change_of_directors.py.""" - import copy +from datetime import timezone from http import HTTPStatus import datedelta import pytest from freezegun import freeze_time -from business_common.utils.datetime import datetime, timezone -from business_common.utils.legislation_datetime import LegislationDatetime +from business_common.utils import LegislationDatetime, datetime from business_model.models import Business from legal_api.services import flags from legal_api.services.filings import validate diff --git a/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_effective_date.py b/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_effective_date.py index 4e58ac1e72..1ded786731 100644 --- a/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_effective_date.py +++ b/legal-api/tests/unit/services/filings/validations/change_of_director/test_validation_effective_date.py @@ -13,12 +13,12 @@ # limitations under the License. """Test Change of Director effective date validations. See rules in change_of_directors.py.""" import copy +from datetime import timezone import datedelta from freezegun import freeze_time -from business_common.utils.datetime import datetime, timezone -from business_common.utils.legislation_datetime import LegislationDatetime +from business_common.utils import LegislationDatetime, datetime from business_model.models import Business from legal_api.services import flags from legal_api.services.filings.validations.change_of_directors import validate_effective_date diff --git a/legal-api/tests/unit/services/filings/validations/test_alteration.py b/legal-api/tests/unit/services/filings/validations/test_alteration.py index ae960af381..b9b0114d7c 100644 --- a/legal-api/tests/unit/services/filings/validations/test_alteration.py +++ b/legal-api/tests/unit/services/filings/validations/test_alteration.py @@ -13,7 +13,7 @@ # limitations under the License. """Test Correction validations.""" import copy -from datetime import date +from datetime import date, timezone from http import HTTPStatus from unittest.mock import MagicMock, patch @@ -22,7 +22,7 @@ from freezegun import freeze_time from reportlab.lib.pagesizes import letter -from business_common.utils.datetime import datetime, timezone +from business_common.utils import datetime from business_model.models import Business from legal_api.errors import Error from legal_api.services import flags, NameXService diff --git a/legal-api/tests/unit/services/filings/validations/test_amalgamation_application.py b/legal-api/tests/unit/services/filings/validations/test_amalgamation_application.py index b8e96720b4..540eb62b79 100644 --- a/legal-api/tests/unit/services/filings/validations/test_amalgamation_application.py +++ b/legal-api/tests/unit/services/filings/validations/test_amalgamation_application.py @@ -770,7 +770,7 @@ def mock_find_by_identifier(identifier): mocker.patch('legal_api.services.filings.validations.amalgamation_application._has_pending_filing', return_value=False) mocker.patch('business_model.models.business.Business.find_by_identifier', side_effect=mock_find_by_identifier) - mocker.patch('legal_api.services.bootstrap.AccountService.get_account_by_affiliated_identifier', + mocker.patch('legal_api.resources.v2.business.business.AccountService.get_account_by_affiliated_identifier', return_value={'orgs': [{'id': account_id}]} if test_status == 'SUCCESS' else {}) with jwt_request_context(app, jwt, [STAFF_ROLE]): @@ -894,7 +894,7 @@ def mock_find_by_identifier(identifier): mocker.patch('legal_api.services.filings.validations.amalgamation_application._has_pending_filing', return_value=False) mocker.patch('business_model.models.business.Business.find_by_identifier', side_effect=mock_find_by_identifier) - mocker.patch('legal_api.services.bootstrap.AccountService.get_account_by_affiliated_identifier', + mocker.patch('legal_api.resources.v2.business.business.AccountService.get_account_by_affiliated_identifier', return_value={'orgs': [{'id': account_id}]} if test_status in 'SUCCESS_AFFILIATED' else {}) mocker.patch.object(flags, 'is_on', return_value=flag_enabled) @@ -903,7 +903,7 @@ def mock_find_by_identifier(identifier): HTTPStatus.BAD_REQUEST, [{'message': 'Permission Denied - You do not have permissions to amalgamate an unaffiliated business.'}]) mocker.patch.object(PermissionService, 'check_user_permission', return_value=permission_error) - mocker.patch('legal_api.services.bootstrap.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) + mocker.patch('legal_api.services.filings.validations.common_validations.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) with jwt_request_context(app, jwt, [BASIC_USER], 'basic-user', account_id): err = validate(None, filing, account_id) @@ -977,7 +977,7 @@ def mock_find_by_identifier(identifier): HTTPStatus.BAD_REQUEST, [{'message': 'Permission Denied - You do not have permissions to amalgamate business which is not in good standing.'}]) mocker.patch.object(PermissionService, 'check_user_permission', return_value=permission_error) - mocker.patch('legal_api.services.bootstrap.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) + mocker.patch('legal_api.services.filings.validations.common_validations.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) with jwt_request_context(app, jwt, [BASIC_USER], 'basic-user', account_id): err = validate(None, filing, account_id) @@ -1089,7 +1089,7 @@ def mock_find_by_identifier(identifier): HTTPStatus.BAD_REQUEST, [{'message': 'Permission Denied - You do not have permissions to amalgamate a foreign corporation.'}]) mocker.patch.object(PermissionService, 'check_user_permission', return_value=permission_error) - mocker.patch('legal_api.services.bootstrap.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) + mocker.patch('legal_api.services.filings.validations.common_validations.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) with jwt_request_context(app, jwt, [role], 'test-user', account_id): err = validate(None, filing, account_id) diff --git a/legal-api/tests/unit/services/filings/validations/test_incorporation_application.py b/legal-api/tests/unit/services/filings/validations/test_incorporation_application.py index 35ea016573..e43cd4d7f8 100644 --- a/legal-api/tests/unit/services/filings/validations/test_incorporation_application.py +++ b/legal-api/tests/unit/services/filings/validations/test_incorporation_application.py @@ -2065,7 +2065,7 @@ def test_incorporation_permission_and_completing_party_flag(mocker, app, session mocker.patch.object(incorporation_application, 'validate_email', return_value=[]) mocker.patch.object(incorporation_application, 'validate_name_translation', return_value=[]) - mocker.patch('legal_api.services.bootstrap.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) + mocker.patch('legal_api.services.filings.validations.common_validations.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) mocker.patch.object(flags, 'is_on', return_value=flag_enabled) mock_validate_permission = mocker.patch.object(incorporation_application, diff --git a/legal-api/tests/unit/services/filings/validations/test_registration.py b/legal-api/tests/unit/services/filings/validations/test_registration.py index f78a12440a..11f432db17 100644 --- a/legal-api/tests/unit/services/filings/validations/test_registration.py +++ b/legal-api/tests/unit/services/filings/validations/test_registration.py @@ -151,7 +151,7 @@ def test_sp_registration(app, session, jwt): def test_dba_registration(mocker, app, session, jwt): """Assert that the general partnership registration is valid.""" - mocker.patch('legal_api.services.bootstrap.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) + mocker.patch('legal_api.services.namex.AccountService.get_contacts', return_value={'contacts': [{'email': 'test@example.com'}]}) with patch.object(NameXService, 'query_nr_number', return_value=_mock_nr_response('SP')): with patch.object(NaicsService, 'find_by_code', return_value=naics_response): with patch.object(flags, 'is_on', return_value=True): diff --git a/legal-api/tests/unit/services/test_involuntary_dissolution.py b/legal-api/tests/unit/services/test_involuntary_dissolution.py index 16fa3d6772..34f4047386 100644 --- a/legal-api/tests/unit/services/test_involuntary_dissolution.py +++ b/legal-api/tests/unit/services/test_involuntary_dissolution.py @@ -23,7 +23,7 @@ from unittest.mock import patch from registry_schemas.example_data import FILING_HEADER, RESTORATION, TRANSITION_FILING_TEMPLATE -from business_common.utils.datetime import datetime +from business_common.utils import datetime from business_model.models import Batch, Business from legal_api.services import flags, InvoluntaryDissolutionService from tests.unit.models import ( @@ -381,7 +381,7 @@ def test_get_businesses_eligible_query_order(session, test_name, expected_order) ('combine_filter', True, {'include-accounts': [0, 1], 'exclude-accounts': [2, 3]}) ] ) -def test_check_feature_flags_filte(app, session, mocker, test_name, enable_involuntary_dissolution_filter, involuntary_dissolution_filter): +def test_check_feature_flags_filter(app, session, mocker, test_name, enable_involuntary_dissolution_filter, involuntary_dissolution_filter): """Assert the feature_flags_filter with flag""" identifiers = ['BC1111111', 'BC2222222', 'BC3333333', 'BC4444444', 'BC5555555', 'BC6666666', 'BC7777777', 'BC8888888', 'BC9999999'] for indetifier in identifiers: @@ -426,7 +426,7 @@ def test_check_feature_flags_filte(app, session, mocker, test_name, enable_invol def side_effect(id): return get_affiliation_response[id] - mocker.patch('legal_api.services.bootstrap.AccountService.get_affiliations', side_effect=side_effect) + mocker.patch('legal_api.services.involuntary_dissolution.AccountService.get_affiliations', side_effect=side_effect) with patch.object(flags, 'is_on', return_value=enable_involuntary_dissolution_filter): with patch.object(flags, 'value', return_value=involuntary_dissolution_filter): diff --git a/legal-api/tests/unit/services/test_registraion_bootstrap_service.py b/legal-api/tests/unit/services/test_registraion_bootstrap_service.py index 8fb0d14e38..c7606ad562 100644 --- a/legal-api/tests/unit/services/test_registraion_bootstrap_service.py +++ b/legal-api/tests/unit/services/test_registraion_bootstrap_service.py @@ -25,8 +25,8 @@ import requests from flask import current_app +from business_account import AccountService from legal_api.services import RegistrationBootstrapService -from legal_api.services.bootstrap import AccountService from tests import integration_affiliation diff --git a/legal-api/tests/unit/services/warnings/business/business_checks/test_in_liquidation.py b/legal-api/tests/unit/services/warnings/business/business_checks/test_in_liquidation.py index c3f5b9efb2..25cf3c4c9d 100644 --- a/legal-api/tests/unit/services/warnings/business/business_checks/test_in_liquidation.py +++ b/legal-api/tests/unit/services/warnings/business/business_checks/test_in_liquidation.py @@ -12,10 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. """Test suite to ensure Corpse business checks work correctly for businesses in liquidation.""" +from datetime import date + import pytest from psycopg2.tz import FixedOffsetTimezone -from business_common.utils.datetime import datetime, date +from business_common.utils import datetime from business_model.models import Business from legal_api.services.warnings.business import check_business from legal_api.services.warnings.business.business_checks import WarningType, BusinessWarningCodes diff --git a/legal-api/tests/unit/services/warnings/business/business_checks/test_involuntary_dissolution.py b/legal-api/tests/unit/services/warnings/business/business_checks/test_involuntary_dissolution.py index 63453fa1ee..c0c4b7c675 100644 --- a/legal-api/tests/unit/services/warnings/business/business_checks/test_involuntary_dissolution.py +++ b/legal-api/tests/unit/services/warnings/business/business_checks/test_involuntary_dissolution.py @@ -17,7 +17,7 @@ import pytest from datedelta import datedelta -from business_common.utils.datetime import datetime +from business_common.utils import datetime from business_model.models import Batch, BatchProcessing, Business from legal_api.services.warnings.business.business_checks import WarningType, BusinessWarningCodes from legal_api.services.warnings.business.business_checks.involuntary_dissolution import ( From 2c0c0f4d486a00723031bbb42de23a856a760098 Mon Sep 17 00:00:00 2001 From: Kial Jinnah Date: Thu, 28 May 2026 08:41:13 -0400 Subject: [PATCH 2/3] chore: cleanup Signed-off-by: Kial Jinnah --- legal-api/tests/unit/reports/test_document_service.py | 1 - 1 file changed, 1 deletion(-) diff --git a/legal-api/tests/unit/reports/test_document_service.py b/legal-api/tests/unit/reports/test_document_service.py index 0b900fe97d..675e80a5c1 100644 --- a/legal-api/tests/unit/reports/test_document_service.py +++ b/legal-api/tests/unit/reports/test_document_service.py @@ -379,7 +379,6 @@ def test_create_document(app, session, mock_bearer_token, mock_doc_service): def test_get_document(app, session, mock_bearer_token, mock_doc_service): - # mocker.patch("legal_api.reports.document_service.AccountService.get_bearer_token", json={"access_token": "fake-token"}) founding_date = datetime.now(UTC) business = factory_business('CP1234567', founding_date=founding_date) filing = copy.deepcopy(FILING_TEMPLATE) From 5412c2c62c359b4222a67626fa342d1da8fc0d20 Mon Sep 17 00:00:00 2001 From: Kial Jinnah Date: Thu, 28 May 2026 08:43:44 -0400 Subject: [PATCH 3/3] chore: ruff fix Signed-off-by: Kial Jinnah --- legal-api/src/legal_api/resources/v2/namerequest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/legal-api/src/legal_api/resources/v2/namerequest.py b/legal-api/src/legal_api/resources/v2/namerequest.py index 0bbb5ba524..4e648a220f 100644 --- a/legal-api/src/legal_api/resources/v2/namerequest.py +++ b/legal-api/src/legal_api/resources/v2/namerequest.py @@ -21,7 +21,7 @@ from flask_cors import cross_origin from business_account import AccountService -from legal_api.services import namex, flags +from legal_api.services import flags, namex from legal_api.services.permissions import ListActionsPermissionsAllowed, PermissionService from legal_api.utils.auth import jwt from legal_api.utils.formatting import normalize_phone