Skip to content

Add unit tests for status and condition helper functions #75

Description

@R-Lawton

Summary

Write unit tests for the pure functions that check, compare, and build Kubernetes status conditions. These are critical to the controller's decision-making and are all testable without envtest.

Testing Guidance

For each function, think about:

  • What does it return for normal, expected input?
  • What happens at the boundaries — nil conditions, empty slices, missing fields?
  • If there's branching logic, have you covered each branch?

Scope

api/v1alpha1/apikey_types.go

  • IsApproved() — checks whether an APIKey has an "Approved" condition set to True. Consider: condition present and True, condition present and False, no conditions at all, nil status.

internal/controller/apiproduct_helper.go

  • IsAuthPolicyAcceptedAndEnforced() — returns true only when both Accepted and Enforced conditions are True. Think about each combination: both true, one true, neither, nil policy.
  • IsAuthPolicyAccepted(), IsAuthPolicyEnforced() — individual condition checks.
  • IsAuthPolicyConditionTrue() — generic condition checker. Handles nil policy — test that path.

internal/controller/apiproduct_controller.go

  • authPolicyDiscoveredCondition() — builds a condition reflecting whether an AuthPolicy was found and is accepted+enforced. Test with nil policy, found but not enforced, and fully healthy.
  • openAPISpecReadyCondition() — builds a condition for OpenAPI spec readiness. Has three paths: no URL configured (returns nil), fetch error, and success.
  • oidcDiscoveredCondition() — builds a condition for OIDC discovery. Has three paths: no auth scheme, fetch error, and success.

internal/controller/apikey_status_controller.go

  • getInvalidReason() — returns a reason string from a condition, or a default if nil. Simple null-safe getter.

internal/controller/apikeyrequest_status_controller.go

  • conditionsEqual() — compares two condition slices ignoring LastTransitionTime. Think about: same conditions, different order, different status, empty slices, nil.
  • copyConditions() — deep copies a condition slice. Verify the copy is independent of the original (mutating the copy shouldn't affect the source).

Review & Verification

PRs should include:

  • How to review the changes (areas of interest, suggested review order)
  • Steps to confirm locally: make test runs and passes

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions