# FALLBACK ConfigMap.
# This static skeleton is only used when The Watcher agent fails to generate
# a bespoke k6 script. When generation succeeds, the agent produces a custom
# ConfigMap containing the tailored load-test.js that replaces this file in
# the scaffolded output repository.
apiVersion: v1
kind: ConfigMap
metadata:
  name: k6-test-${{ values.component_id }}
  namespace: ${{ values.destination_namespace }}
  labels:
    app: ${{ values.component_id }}
    app.kubernetes.io/managed-by: backstage
    app.kubernetes.io/component: load-testing
data:
  K6_OUT: "opentelemetry"
  K6_OTEL_GRPC_EXPORTER_INSECURE: "true"
  K6_OTEL_GRPC_EXPORTER_ENDPOINT: "otel-collector.monitoring.svc.cluster.local:4317"
  K6_OTEL_METRIC_PREFIX: "k6_"
  K6_OTEL_FLUSH_INTERVAL: "1000"
  K6_OTEL_EXPORT_INTERVAL: "5000"
  K6_OTEL_SERVICE_NAME: "k6-${{ values.component_id }}"
  load-test.js: |
    import http from 'k6/http';
    import { check, sleep } from 'k6';

    const vus = parseInt(__ENV.TEST_VUS || '10');
    const duration = __ENV.TEST_DURATION || '30s';
    const targetUrl = __ENV.TARGET_URL || 'http://localhost';

    export const options = {
      scenarios: {
        load_test: {
          executor: 'ramping-vus',
          startVUs: 0,
          stages: [
            { duration: '10s', target: vus },
            { duration: duration, target: vus },
            { duration: '5s', target: 0 },
          ],
        },
      },
      thresholds: {
        http_req_duration: ['p(95)<500'],
        http_req_failed: ['rate<0.075'],
      },
    };

    // Treat 2xx and 3xx responses as expected (redirects won't inflate http_req_failed)
    http.setResponseCallback(http.expectedStatuses({ min: 200, max: 399 }));

    export default function () {
      const res = http.get(targetUrl);
      check(res, {
        'status is 200': (r) => r.status === 200,
        'response time < 500ms': (r) => r.timings.duration < 500,
      });
      sleep(0.5);
    }
