rule_files:
  - rules.yml

evaluation_interval: 1m

tests:
  # Basic tests for promql_expr_test, not dependent on rules.
  - interval: 1m
    input_series:
      - series: test_full
        values: "0 0"

      - series: test_stale
        values: "0 stale"

      - series: test_missing
        values: "0 _ _ _ _ _ _ 0"

    promql_expr_test:
      # Ensure the sample is evaluated at the time we expect it to be.
      - expr: timestamp(test_full)
        eval_time: 0m
        exp_samples:
          - value: 0
      - expr: timestamp(test_full)
        eval_time: 1m
        exp_samples:
          - value: 60
      - expr: timestamp(test_full)
        eval_time: 2m
        exp_samples:
          - value: 60

      # Ensure a value is stale as soon as it is marked as such.
      - expr: test_stale
        eval_time: 59s
        exp_samples:
          - value: 0
            labels: "test_stale"
      - expr: test_stale
        eval_time: 1m
        exp_samples: []

      # Ensure lookback delta is respected, when a value is missing.
      - expr: timestamp(test_missing)
        eval_time: 5m
        exp_samples:
          - value: 0
      - expr: timestamp(test_missing)
        eval_time: 5m1s
        exp_samples: []

  # Minimal test case to check edge case of a single sample.
  - input_series:
      - series: test
        values: 1

    promql_expr_test:
      - expr: test
        eval_time: 0
        exp_samples:
          - value: 1
            labels: test

  # Test recording rules run even if input_series isn't provided.
  - promql_expr_test:
      - expr: count_over_time(fixed_data[1h])
        eval_time: 1h
        exp_samples:
          - value: 61
      - expr: timestamp(fixed_data)
        eval_time: 1h
        exp_samples:
          - value: 3600

  # Tests for alerting rules.
  - interval: 1m
    input_series:
      - series: 'up{job="prometheus", instance="localhost:9090"}'
        values: "0+0x1440"

    promql_expr_test:
      - expr: count(ALERTS) by (alertname, alertstate)
        eval_time: 4m
        exp_samples:
          - labels: '{alertname="AlwaysFiring",alertstate="firing"}'
            value: 1
          - labels: '{alertname="InstanceDown",alertstate="pending"}'
            value: 1

    alert_rule_test:
      - eval_time: 1d
        alertname: AlwaysFiring
        exp_alerts:
          - {}

      - eval_time: 1d
        alertname: InstanceDown
        exp_alerts:
          - exp_labels:
              severity: page
              instance: localhost:9090
              job: prometheus
            exp_annotations:
              summary: "Instance localhost:9090 down"
              description: "localhost:9090 of job prometheus has been down for more than 5 minutes."

      - eval_time: 0
        alertname: AlwaysFiring
        exp_alerts:
          - {}

      - eval_time: 0
        alertname: InstanceDown
        exp_alerts: []

  # Tests for interval vs evaluation_interval.
  - interval: 1s
    input_series:
      - series: 'test{job="test", instance="x:0"}'
        # 2 minutes + 1 second of input data, recording rules should only run
        # once a minute.
        values: "0+1x120"

    promql_expr_test:
      - expr: job:test:count_over_time1m
        eval_time: 0m
        exp_samples:
          - value: 1
            labels: 'job:test:count_over_time1m{job="test"}'
      - expr: timestamp(job:test:count_over_time1m)
        eval_time: 10s
        exp_samples:
          - value: 0
            labels: '{job="test"}'

      - expr: job:test:count_over_time1m
        eval_time: 1m
        exp_samples:
          - value: 61
            labels: 'job:test:count_over_time1m{job="test"}'
      - expr: timestamp(job:test:count_over_time1m)
        eval_time: 1m10s
        exp_samples:
          - value: 60
            labels: '{job="test"}'

      - expr: job:test:count_over_time1m
        eval_time: 2m
        exp_samples:
          - value: 61
            labels: 'job:test:count_over_time1m{job="test"}'
      - expr: timestamp(job:test:count_over_time1m)
        eval_time: 2m59s999ms
        exp_samples:
          - value: 120
            labels: '{job="test"}'
