# Copyright (c) 2024 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

# yaml-language-server: $schema=https://raw.githubusercontent.com/helm-unittest/helm-unittest/main/schema/helm-testsuite.json
suite: "sequencer values"
templates:
  - sequencer.yaml
release:
  # Set for testing labels
  name: global-domain-6
chart:
  # Override for testing labels
  version: 0.1.1
  appVersion: 0.1.0
set:
  # Things we need just to pass the schema
  sequencer:
    driver:
      type: cometbft
tests:
  - it: "sets labels as expected"
    documentSelector:
      path: kind
      value: Deployment
    asserts:
      # Sanity checks
      - equal:
          path: metadata.name
          value: global-domain-6-sequencer
      - equal:
          path: spec.template.spec.containers[0].name
          value: sequencer
      # Labels on deployment
      - isSubset:
          path: metadata.labels
          content:
            # Splice-specific
            app: global-domain-6-sequencer
            splice-component: sequencer
            # k8s/Helm standard
            app.kubernetes.io/component: sequencer
            app.kubernetes.io/instance: global-domain-6
            app.kubernetes.io/managed-by: Helm
            app.kubernetes.io/name: global-domain-6-sequencer
            app.kubernetes.io/version: "0.1.0"
            helm.sh/chart: splice-global-domain-0.1.1
      # Labels on pod; should be the same as on deployment
      - isSubset:
          path: spec.template.metadata.labels
          content:
            # Splice-specific
            app: global-domain-6-sequencer
            splice-component: sequencer
            # k8s/Helm standard
            app.kubernetes.io/component: sequencer
            app.kubernetes.io/instance: global-domain-6
            app.kubernetes.io/managed-by: Helm
            app.kubernetes.io/name: global-domain-6-sequencer
            app.kubernetes.io/version: "0.1.0"
            helm.sh/chart: splice-global-domain-0.1.1
  - it: "can enable postgres metrics"
    set:
      sequencer:
      # Things we need for the postgres exporter
        persistence:
          postgresName: sequencer-6
      enablePostgresMetrics: true
    # We named the Service like the Deployment, so I'm out of ideas on how to use documentSelector
    documentIndex: 2
    asserts:
      - equal:
          path: metadata.name
          value: pge-sequencer-6-cantonnet-sequencer
      - equal:
          path: metadata.labels.app
          value: pge-sequencer-6-cantonnet-sequencer
  - it: "can enable pvc"
    set:
      # Things we need for the pvc mount
      pvc:
        size: 10Gi
        volumeStorageClass: standard-rwo
    documentSelector:
      path: kind
      value: PersistentVolumeClaim
    asserts:
      - equal:
          path: metadata.name
          value: global-domain-6-sequencer-pvc
  - it: "sets log-level environment variables correctly when only logLevel is provided"
    set:
      # Set log level for testing
      logLevel: WARN
    documentSelector:
      path: kind
      value: Deployment
    asserts:
      - contains:
          path: spec.template.spec.containers[0].env
          content:
            name: LOG_LEVEL_CANTON
            value: WARN
      - contains:
          path: spec.template.spec.containers[0].env
          content:
            name: LOG_LEVEL_STDOUT
            value: DEBUG
  - it: "sets log-level environment variables correctly when both logLevel and logLevelStdout are provided"
    set:
      # Set log levels for testing
      logLevel: DEBUG
      logLevelStdout: ERROR
    documentSelector:
      path: kind
      value: Deployment
    asserts:
      - contains:
          path: spec.template.spec.containers[0].env
          content:
            name: LOG_LEVEL_CANTON
            value: DEBUG
      - contains:
          path: spec.template.spec.containers[0].env
          content:
            name: LOG_LEVEL_STDOUT
            value: ERROR
  - it: "sets anti affinity by default"
    documentSelector:
      path: kind
      value: Deployment
    asserts:
      - equal:
          path: spec.template.spec.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution[0].labelSelector.matchExpressions[0].values[0]
          value: "sequencer"
  - it: "sets affinity alongside default anti affinity"
    set:
      affinity:
        nodeAffinity:
          test: true
    documentSelector:
      path: kind
      value: Deployment
    asserts:
      - exists:
          path: spec.template.spec.affinity.nodeAffinity
      - exists:
          path: spec.template.spec.affinity.podAntiAffinity
  - it: "sets only the specified affinity"
    set:
      enableAntiAffinity: false
      affinity:
        nodeAffinity:
          test: true
    documentSelector:
      path: kind
      value: Deployment
    asserts:
      - exists:
          path: spec.template.spec.affinity.nodeAffinity.test
      - notExists:
          path: spec.template.spec.affinity.podAntiAffinity
  - it: "doesn't set any affinity"
    set:
      enableAntiAffinity: false
    documentSelector:
      path: kind
      value: Deployment
    asserts:
      - notExists:
          path: spec.template.spec.affinity
