Test Cases: Membership Types CRUD
Module: Membership & Profiles - Membership Types Management
Priority: P1
Phase: 2
Backend Endpoints:
GET /api/membership/typesPOST /api/membership/typesPUT /api/membership/types/:idDELETE /api/membership/types/:id
Prerequisites
- User must be Admin for create, update, delete, and set default operations.
- User must have Member read access for listing membership types.
- At least one membership type should exist in the system for update/delete tests.
Test Cases
TC-MTYPE-01: List Membership Types
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as any authenticated user with member read access. | Login successful. |
| 2 | Call GET /api/membership/types. | Request returns status 200 OK. |
| 3 | Verify Response. | JSON array of membership types returned with id, name, description, amountCents, currency, period, isDefault fields. |
| 4 | Verify Sorting. | Types are returned in a consistent order (e.g., by name or creation date). |
TC-MTYPE-02: List Membership Types - Unauthorized
| Step | Action | Expected Result |
|---|---|---|
| 1 | Call GET /api/membership/types without authentication. | - |
| 2 | Verify Response. | Status 401 Unauthorized returned. |
TC-MTYPE-03: Create Membership Type - Valid Data
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | Login successful. |
| 2 | Call POST /api/membership/types with valid payload: {"name": "Professional", "description": "For working professionals", "amountCents": 750000, "currency": "PHP", "period": "ANNUAL"}. | - |
| 3 | Verify Response. | Status 201 Created. Returns created membership type with assigned id. |
| 4 | Verify Persistence. | Call GET /api/membership/types. New type appears in the list. |
TC-MTYPE-04: Create Membership Type - All Period Types
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Create membership type with period: "MONTHLY". | Status 201 Created. |
| 3 | Create membership type with period: "QUARTERLY". | Status 201 Created. |
| 4 | Create membership type with period: "ANNUAL". | Status 201 Created. |
| 5 | Create membership type with period: "LIFETIME". | Status 201 Created. |
| 6 | Verify all types. | All period types stored correctly in database. |
TC-MTYPE-05: Create Membership Type - Non-Admin (Forbidden)
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as regular Member (non-Admin). | Login successful. |
| 2 | Call POST /api/membership/types with valid payload. | - |
| 3 | Verify Response. | Status 403 Forbidden. Error message indicates insufficient permissions. |
TC-MTYPE-06: Create Membership Type - Duplicate Name
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Create membership type with name "Standard". | Status 201 Created. |
| 3 | Attempt to create another type with name "Standard". | Status 400 Bad Request or 409 Conflict. |
| 4 | Verify Error Message. | Error indicates duplicate name not allowed. |
TC-MTYPE-07: Create Membership Type - Invalid Amount (Negative)
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call POST /api/membership/types with amountCents: -5000. | - |
| 3 | Verify Response. | Status 400 Bad Request. Validation error for negative amount. |
TC-MTYPE-08: Create Membership Type - Invalid Amount (Zero for Non-Free)
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call POST /api/membership/types with amountCents: 0 (if zero is not allowed). | - |
| 3 | Verify Response. | Validation error or success based on business rules. Document expected behavior. |
TC-MTYPE-09: Create Membership Type - Missing Required Fields
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call POST /api/membership/types with missing name. | Status 400 Bad Request. Validation error for missing name. |
| 3 | Call POST /api/membership/types with missing amountCents. | Status 400 Bad Request. Validation error for missing amount. |
| 4 | Call 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
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call POST /api/membership/types with period: "WEEKLY" (invalid enum). | - |
| 3 | Verify Response. | Status 400 Bad Request. Validation error for invalid period. |
TC-MTYPE-11: Update Membership Type - Valid Data
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Get existing membership type ID. | - |
| 3 | Call PUT /api/membership/types/:id with updated payload: {"name": "Professional Plus", "description": "Updated description", "amountCents": 850000, "currency": "PHP", "period": "ANNUAL"}. | - |
| 4 | Verify Response. | Status 200 OK. Returns updated membership type. |
| 5 | Verify Persistence. | Call GET /api/membership/types. Updated values reflected. |
TC-MTYPE-12: Update Membership Type - Partial Update
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call PUT /api/membership/types/:id with only description field. | - |
| 3 | Verify Response. | Status 200 OK. Only description updated; other fields unchanged. |
TC-MTYPE-13: Update Membership Type - Non-Admin (Forbidden)
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as regular Member. | - |
| 2 | Call PUT /api/membership/types/:id with valid payload. | - |
| 3 | Verify Response. | Status 403 Forbidden. |
TC-MTYPE-14: Update Membership Type - Non-Existent ID
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call PUT /api/membership/types/99999 (non-existent ID). | - |
| 3 | Verify Response. | Status 404 Not Found. |
TC-MTYPE-15: Update Membership Type - Duplicate Name Conflict
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Ensure two membership types exist: "Basic" and "Premium". | - |
| 3 | Attempt to update "Basic" with name "Premium". | - |
| 4 | Verify Response. | Status 400 Bad Request or 409 Conflict. Duplicate name error. |
TC-MTYPE-16: Delete Membership Type - No Assigned Members
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Create a new membership type with no members assigned. | Type created. |
| 3 | Call DELETE /api/membership/types/:id. | - |
| 4 | Verify Response. | Status 200 OK or 204 No Content. |
| 5 | Verify Deletion. | Type no longer appears in GET /api/membership/types. |
TC-MTYPE-17: Delete Membership Type - With Assigned Members
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Identify a membership type with members assigned. | - |
| 3 | Call DELETE /api/membership/types/:id. | - |
| 4 | Verify Response. | Status 400 Bad Request or 409 Conflict. Error indicates members are assigned. |
| 5 | Verify Type Preserved. | Membership type still exists in the system. |
TC-MTYPE-18: Delete Membership Type - Non-Admin (Forbidden)
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as regular Member. | - |
| 2 | Call DELETE /api/membership/types/:id. | - |
| 3 | Verify Response. | Status 403 Forbidden. |
TC-MTYPE-19: Delete Membership Type - Non-Existent ID
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call DELETE /api/membership/types/99999 (non-existent ID). | - |
| 3 | Verify Response. | Status 404 Not Found. |
TC-MTYPE-20: Delete Default Membership Type
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Identify the default membership type (where isDefault: true). | - |
| 3 | Attempt to delete it. | - |
| 4 | Verify Response. | Status 400 Bad Request. Error indicates cannot delete default type. |
TC-MTYPE-21: Set Default Membership Type
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call endpoint to set a membership type as default (e.g., PUT /api/membership/types/:id with isDefault: true or dedicated endpoint). | - |
| 3 | Verify Response. | Status 200 OK. Type now marked as default. |
| 4 | Verify Previous Default. | Previous default type now has isDefault: false. |
| 5 | Verify Only One Default. | Exactly one type has isDefault: true. |
TC-MTYPE-22: Set Default - Non-Admin (Forbidden)
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as regular Member. | - |
| 2 | Attempt to set a membership type as default. | - |
| 3 | Verify Response. | Status 403 Forbidden. |
TC-MTYPE-23: Create Membership Type - Name Length Validation
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call POST /api/membership/types with empty name: "". | Status 400 Bad Request. Validation error. |
| 3 | Call 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
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Call POST /api/membership/types with invalid currency: "INVALID". | - |
| 3 | Verify Response. | Status 400 Bad Request. Validation error for invalid currency code. |
TC-MTYPE-25: Membership Type - Data Integrity with Members
| Step | Action | Expected Result |
|---|---|---|
| 1 | Login as Admin. | - |
| 2 | Assign a member to a specific membership type. | Assignment successful. |
| 3 | Update the membership type's amountCents. | - |
| 4 | Verify Member Record. | Member's existing dues/billing not retroactively affected (or affected per business rules). |
| 5 | Document Behavior. | Confirm expected behavior for price changes on existing memberships. |
Notes
- Currency is expected to be a valid ISO 4217 currency code (e.g., "PHP", "USD").
- Period enum values should be validated against allowed values (MONTHLY, QUARTERLY, ANNUAL, LIFETIME).
- Only one membership type can be the default at any time.
- Deleting a membership type with assigned members should be prevented to maintain data integrity.