Skip to content

Commit 7bd1b61

Browse files
committed
org: Ensure that we allow details only when they have not been submitted
1 parent 895d651 commit 7bd1b61

3 files changed

Lines changed: 51 additions & 2 deletions

File tree

server/polar/organization/service.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ async def update(
360360
},
361361
)
362362

363-
if update_schema.details:
363+
if update_schema.details and organization.status == OrganizationStatus.CREATED:
364364
organization.details = cast(
365365
OrganizationDetails, update_schema.details.model_dump()
366366
)

server/tests/organization/test_endpoints.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from polar.models import Product, User
99
from polar.models.account import Account
10-
from polar.models.organization import Organization
10+
from polar.models.organization import Organization, OrganizationStatus
1111
from polar.models.subscription import SubscriptionStatus
1212
from polar.models.user_organization import UserOrganization
1313
from polar.payout_account.service import PayoutAccountServiceError
@@ -298,11 +298,15 @@ async def test_submit_for_review_valid(
298298
self,
299299
client: AsyncClient,
300300
mocker: MockerFixture,
301+
save_fixture: SaveFixture,
301302
organization: Organization,
302303
user_organization: UserOrganization,
303304
) -> None:
304305
enqueue_job_mock = mocker.patch("polar.organization.service.enqueue_job")
305306

307+
organization.status = OrganizationStatus.CREATED
308+
await save_fixture(organization)
309+
306310
update_response = await client.patch(
307311
f"/v1/organizations/{organization.id}",
308312
json={

server/tests/organization/test_service.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
from polar.exceptions import PolarRequestValidationError
1818
from polar.models import Customer, Organization, Product, User
1919
from polar.models.account import Account
20+
from polar.models.organization import (
21+
OrganizationDetails as OrganizationDetailsDict,
22+
)
2023
from polar.models.organization import (
2124
OrganizationNotificationSettings,
2225
OrganizationStatus,
@@ -239,6 +242,10 @@ async def test_update_details_does_not_submit_for_review(
239242
) -> None:
240243
enqueue_job_mock = mocker.patch("polar.organization.service.enqueue_job")
241244

245+
organization.status = OrganizationStatus.CREATED
246+
session.add(organization)
247+
await session.flush()
248+
242249
result = await organization_service.update(
243250
session,
244251
organization,
@@ -271,6 +278,9 @@ async def test_update_with_submit_for_review(
271278
organization: Organization,
272279
) -> None:
273280
enqueue_job_mock = mocker.patch("polar.organization.service.enqueue_job")
281+
organization.status = OrganizationStatus.CREATED
282+
session.add(organization)
283+
await session.flush()
274284
await organization_service.update(
275285
session,
276286
organization,
@@ -306,6 +316,9 @@ async def test_update_with_submit_for_review_requires_relevant_fields(
306316
session: AsyncSession,
307317
organization: Organization,
308318
) -> None:
319+
organization.status = OrganizationStatus.CREATED
320+
session.add(organization)
321+
await session.flush()
309322
await organization_service.update(
310323
session,
311324
organization,
@@ -328,6 +341,38 @@ async def test_update_with_submit_for_review_requires_relevant_fields(
328341
assert ("body", "socials") in error_locations
329342
assert ("body", "details", "product_description") in error_locations
330343

344+
@pytest.mark.auth
345+
async def test_update_details_ignored_after_initial_status(
346+
self,
347+
session: AsyncSession,
348+
organization: Organization,
349+
) -> None:
350+
original_details: OrganizationDetailsDict = {
351+
"product_description": "Original description for the organization.",
352+
"selling_categories": ["Software / SaaS"],
353+
"pricing_models": ["Subscription"],
354+
"switching": False,
355+
}
356+
organization.details = original_details
357+
organization.status = OrganizationStatus.ACTIVE
358+
session.add(organization)
359+
await session.flush()
360+
361+
result = await organization_service.update(
362+
session,
363+
organization,
364+
OrganizationUpdate(
365+
details=OrganizationDetails(
366+
product_description="Attempted tampering after approval.",
367+
selling_categories=["Other"],
368+
pricing_models=["One-time"],
369+
switching=True,
370+
)
371+
),
372+
)
373+
374+
assert result.details == original_details
375+
331376

332377
@pytest.mark.asyncio
333378
async def test_get_next_invoice_number_organization(

0 commit comments

Comments
 (0)