Test Cases: Membership Types CRUD

Module: Membership & Profiles - Membership Types Management

Priority: P1

Phase: 2

Backend Endpoints:

Prerequisites

Test Cases

TC-MTYPE-01: List Membership Types

StepActionExpected Result
1Login as any authenticated user with member read access.Login successful.
2Call GET /api/membership/types.Request returns status 200 OK.
3Verify Response.JSON array of membership types returned with id, name, description, amountCents, currency, period, isDefault fields.
4Verify Sorting.Types are returned in a consistent order (e.g., by name or creation date).

TC-MTYPE-02: List Membership Types - Unauthorized

StepActionExpected Result
1Call GET /api/membership/types without authentication.-
2Verify Response.Status 401 Unauthorized returned.

TC-MTYPE-03: Create Membership Type - Valid Data

StepActionExpected Result
1Login as Admin.Login successful.
2Call POST /api/membership/types with valid payload: {"name": "Professional", "description": "For working professionals", "amountCents": 750000, "currency": "PHP", "period": "ANNUAL"}.-
3Verify Response.Status 201 Created. Returns created membership type with assigned id.
4Verify Persistence.Call GET /api/membership/types. New type appears in the list.

TC-MTYPE-04: Create Membership Type - All Period Types

StepActionExpected Result
1Login as Admin.-
2Create membership type with period: "MONTHLY".Status 201 Created.
3Create membership type with period: "QUARTERLY".Status 201 Created.
4Create membership type with period: "ANNUAL".Status 201 Created.
5Create membership type with period: "LIFETIME".Status 201 Created.
6Verify all types.All period types stored correctly in database.

TC-MTYPE-05: Create Membership Type - Non-Admin (Forbidden)

StepActionExpected Result
1Login as regular Member (non-Admin).Login successful.
2Call POST /api/membership/types with valid payload.-
3Verify Response.Status 403 Forbidden. Error message indicates insufficient permissions.

TC-MTYPE-06: Create Membership Type - Duplicate Name

StepActionExpected Result
1Login as Admin.-
2Create membership type with name "Standard".Status 201 Created.
3Attempt to create another type with name "Standard".Status 400 Bad Request or 409 Conflict.
4Verify Error Message.Error indicates duplicate name not allowed.

TC-MTYPE-07: Create Membership Type - Invalid Amount (Negative)

StepActionExpected Result
1Login as Admin.-
2Call POST /api/membership/types with amountCents: -5000.-
3Verify Response.Status 400 Bad Request. Validation error for negative amount.

TC-MTYPE-08: Create Membership Type - Invalid Amount (Zero for Non-Free)

StepActionExpected Result
1Login as Admin.-
2Call POST /api/membership/types with amountCents: 0 (if zero is not allowed).-
3Verify Response.Validation error or success based on business rules. Document expected behavior.

TC-MTYPE-09: Create Membership Type - Missing Required Fields

StepActionExpected Result
1Login as Admin.-
2Call POST /api/membership/types with missing name.Status 400 Bad Request. Validation error for missing name.
3Call POST /api/membership/types with missing amountCents.Status 400 Bad Request. Validation error for missing amount.
4Call POST /api/membership/types with missing period.Status 400 Bad Request. Validation error for missing period.

TC-MTYPE-10: Create Membership Type - Invalid Period Value

StepActionExpected Result
1Login as Admin.-
2Call POST /api/membership/types with period: "WEEKLY" (invalid enum).-
3Verify Response.Status 400 Bad Request. Validation error for invalid period.

TC-MTYPE-11: Update Membership Type - Valid Data

StepActionExpected Result
1Login as Admin.-
2Get existing membership type ID.-
3Call PUT /api/membership/types/:id with updated payload: {"name": "Professional Plus", "description": "Updated description", "amountCents": 850000, "currency": "PHP", "period": "ANNUAL"}.-
4Verify Response.Status 200 OK. Returns updated membership type.
5Verify Persistence.Call GET /api/membership/types. Updated values reflected.

TC-MTYPE-12: Update Membership Type - Partial Update

StepActionExpected Result
1Login as Admin.-
2Call PUT /api/membership/types/:id with only description field.-
3Verify Response.Status 200 OK. Only description updated; other fields unchanged.

TC-MTYPE-13: Update Membership Type - Non-Admin (Forbidden)

StepActionExpected Result
1Login as regular Member.-
2Call PUT /api/membership/types/:id with valid payload.-
3Verify Response.Status 403 Forbidden.

TC-MTYPE-14: Update Membership Type - Non-Existent ID

StepActionExpected Result
1Login as Admin.-
2Call PUT /api/membership/types/99999 (non-existent ID).-
3Verify Response.Status 404 Not Found.

TC-MTYPE-15: Update Membership Type - Duplicate Name Conflict

StepActionExpected Result
1Login as Admin.-
2Ensure two membership types exist: "Basic" and "Premium".-
3Attempt to update "Basic" with name "Premium".-
4Verify Response.Status 400 Bad Request or 409 Conflict. Duplicate name error.

TC-MTYPE-16: Delete Membership Type - No Assigned Members

StepActionExpected Result
1Login as Admin.-
2Create a new membership type with no members assigned.Type created.
3Call DELETE /api/membership/types/:id.-
4Verify Response.Status 200 OK or 204 No Content.
5Verify Deletion.Type no longer appears in GET /api/membership/types.

TC-MTYPE-17: Delete Membership Type - With Assigned Members

StepActionExpected Result
1Login as Admin.-
2Identify a membership type with members assigned.-
3Call DELETE /api/membership/types/:id.-
4Verify Response.Status 400 Bad Request or 409 Conflict. Error indicates members are assigned.
5Verify Type Preserved.Membership type still exists in the system.

TC-MTYPE-18: Delete Membership Type - Non-Admin (Forbidden)

StepActionExpected Result
1Login as regular Member.-
2Call DELETE /api/membership/types/:id.-
3Verify Response.Status 403 Forbidden.

TC-MTYPE-19: Delete Membership Type - Non-Existent ID

StepActionExpected Result
1Login as Admin.-
2Call DELETE /api/membership/types/99999 (non-existent ID).-
3Verify Response.Status 404 Not Found.

TC-MTYPE-20: Delete Default Membership Type

StepActionExpected Result
1Login as Admin.-
2Identify the default membership type (where isDefault: true).-
3Attempt to delete it.-
4Verify Response.Status 400 Bad Request. Error indicates cannot delete default type.

TC-MTYPE-21: Set Default Membership Type

StepActionExpected Result
1Login as Admin.-
2Call endpoint to set a membership type as default (e.g., PUT /api/membership/types/:id with isDefault: true or dedicated endpoint).-
3Verify Response.Status 200 OK. Type now marked as default.
4Verify Previous Default.Previous default type now has isDefault: false.
5Verify Only One Default.Exactly one type has isDefault: true.

TC-MTYPE-22: Set Default - Non-Admin (Forbidden)

StepActionExpected Result
1Login as regular Member.-
2Attempt to set a membership type as default.-
3Verify Response.Status 403 Forbidden.

TC-MTYPE-23: Create Membership Type - Name Length Validation

StepActionExpected Result
1Login as Admin.-
2Call POST /api/membership/types with empty name: "".Status 400 Bad Request. Validation error.
3Call POST /api/membership/types with excessively long name (e.g., 500 characters).Status 400 Bad Request. Validation error for max length exceeded.

TC-MTYPE-24: Create Membership Type - Currency Validation

StepActionExpected Result
1Login as Admin.-
2Call POST /api/membership/types with invalid currency: "INVALID".-
3Verify Response.Status 400 Bad Request. Validation error for invalid currency code.

TC-MTYPE-25: Membership Type - Data Integrity with Members

StepActionExpected Result
1Login as Admin.-
2Assign a member to a specific membership type.Assignment successful.
3Update the membership type's amountCents.-
4Verify Member Record.Member's existing dues/billing not retroactively affected (or affected per business rules).
5Document Behavior.Confirm expected behavior for price changes on existing memberships.

Notes