chart:
  appVersion: 0.1.0
  version: 0.1.0
suite: Deployment template (basic)
release:
  name: prometheus-postgres-exporter-unittest
  namespace: testing
templates:
- templates/prometheus-postgres-exporter/deployment.yaml
tests:
- it: Rendering default
  asserts:
  - hasDocuments:
      count: 1
  - containsDocument:
      apiVersion: apps/v1
      kind: Deployment
      name: prometheus-postgres-exporter-unittest
      namespace: testing
  - notExists:
      path: metadata.annotations
  - equal:
      path: metadata.labels
      value:
        app.kubernetes.io/instance: prometheus-postgres-exporter-unittest
        app.kubernetes.io/managed-by: Helm
        app.kubernetes.io/name: prometheus-postgres-exporter
        app.kubernetes.io/version: 0.1.0
        helm.sh/chart: prometheus-postgres-exporter-0.1.0
  - equal:
      path: spec.replicas
      value: 1
  - notExists:
      path: spec.template.spec.affinity
  - contains:
      path: spec.template.spec.containers[0].envFrom
      content:
        secretRef:
          name: prometheus-postgres-exporter-unittest-database-env
  - equal:
      path: spec.template.spec.containers[0].args
      value:
      - --config.file=/etc/prometheus-postgres-exporter/config.d/exporterConfig.yaml
      - --web.config.file=/etc/prometheus-postgres-exporter/config.d/webConfig.yaml
      - --web.listen-address=:9187
  - equal:
      path: spec.template.spec.containers[0].volumeMounts
      value:
      - mountPath: /etc/prometheus-postgres-exporter/config.d
        name: config-d
  - equal:
      path: spec.template.spec.volumes
      value:
      - name: config-d
        projected:
          defaultMode: 444
          sources:
          - secret:
              name: prometheus-postgres-exporter-unittest-exporter-config
          - secret:
              name: prometheus-postgres-exporter-unittest-web-config
  - equal:
      path: spec.template.spec.containers[0].image
      value: quay.io/prometheuscommunity/postgres-exporter:v0.1.0
  - equal:
      path: spec.template.spec.containers[0].imagePullPolicy
      value: IfNotPresent
  - notExists:
      path: spec.template.spec.containers[0].resources
  - notExists:
      path: spec.template.spec.containers[0].securityContext
  - notExists:
      path: spec.template.spec.dnsConfig
  - notExists:
      path: spec.template.spec.dnsPolicy
  - notExists:
      path: spec.template.spec.hostname
  - equal:
      path: spec.template.spec.hostNetwork
      value: false
  - notExists:
      path: spec.template.spec.imagePullSecrets
  - notExists:
      path: spec.template.spec.nodeSelector
  - notExists:
      path: spec.template.spec.priorityClassName
  - notExists:
      path: spec.template.spec.restartPolicy
  - notExists:
      path: spec.template.spec.subdomain
  - equal:
      path: spec.template.spec.terminationGracePeriodSeconds
      value: 60
  - notExists:
      path: spec.template.spec.tolerations
  - notExists:
      path: spec.template.spec.topologySpreadConstraints
  - equal:
      path: spec.strategy
      value:
        type: "RollingUpdate"
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1

- it: Test custom replicas
  set:
    deployment.replicas: 3
  asserts:
  - equal:
      path: spec.replicas
      value: 3

- it: Test custom affinity
  set:
    deployment.affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.kubernetes.io/zone
              operator: In
              values:
              - antarctica-east1
              - antarctica-west1
  asserts:
  - equal:
      path: spec.template.spec.affinity
      value:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: topology.kubernetes.io/zone
                operator: In
                values:
                - antarctica-east1
                - antarctica-west1

- it: Test additional arguments
  set:
    deployment.postgresExporter.args:
    - "--foo=bar"
    - "--bar=foo"
  asserts:
  - equal:
      path: spec.template.spec.containers[0].args
      value:
      - --config.file=/etc/prometheus-postgres-exporter/config.d/exporterConfig.yaml
      - --web.config.file=/etc/prometheus-postgres-exporter/config.d/webConfig.yaml
      - --web.listen-address=:9187
      - --foo=bar
      - --bar=foo

- it: Test custom imageRegistry and imageRepository
  set:
    deployment.postgresExporter.image.registry: registry.example.local
    deployment.postgresExporter.image.repository: path/special/prometheus-postgres-exporter
  asserts:
  - equal:
      path: spec.template.spec.containers[0].image
      value: registry.example.local/path/special/prometheus-postgres-exporter:v0.1.0

- it: Test custom imagePullPolicy
  set:
    deployment.postgresExporter.image.pullPolicy: Always
  asserts:
  - equal:
      path: spec.template.spec.containers[0].imagePullPolicy
      value: Always

- it: Test config.database.existingSecret
  set:
    config.database.existingSecret.enabled: true
    config.database.existingSecret.secretName: custom-database-secret
  asserts:
  - contains:
      path: spec.template.spec.containers[0].envFrom
      content:
        secretRef:
          name: custom-database-secret

- it: Test config.exporterConfig.existingSecret
  set:
    config.exporterConfig.existingSecret.enabled: true
    config.exporterConfig.existingSecret.secretName: exporter-config-secret
  asserts:
  - equal:
      path: spec.template.spec.containers[0].volumeMounts
      value:
      - mountPath: /etc/prometheus-postgres-exporter/config.d
        name: config-d
  - equal:
      path: spec.template.spec.volumes
      value:
      - name: config-d
        projected:
          defaultMode: 444
          sources:
          - secret:
              name: exporter-config-secret
          - secret:
              name: prometheus-postgres-exporter-unittest-web-config

- it: Test config.webConfig.existingSecret
  set:
    config.webConfig.existingSecret.enabled: true
    config.webConfig.existingSecret.secretName: web-config-secret
  asserts:
  - equal:
      path: spec.template.spec.containers[0].volumeMounts
      value:
      - mountPath: /etc/prometheus-postgres-exporter/config.d
        name: config-d
  - equal:
      path: spec.template.spec.volumes
      value:
      - name: config-d
        projected:
          defaultMode: 444
          sources:
          - secret:
              name: prometheus-postgres-exporter-unittest-exporter-config
          - secret:
              name: web-config-secret

- it: Test custom resource limits and requests
  set:
    deployment.postgresExporter.resources:
      limits:
        cpu: 100m
        memory: 250MB
      requests:
        cpu: 25m
        memory: 100MB
  asserts:
  - equal:
      path: spec.template.spec.containers[0].env
      value:
      - name: GOMAXPROCS
        valueFrom:
          resourceFieldRef:
            divisor: "1"
            resource: limits.cpu
  - equal:
      path: spec.template.spec.containers[0].resources
      value:
        limits:
          cpu: 100m
          memory: 250MB
        requests:
          cpu: 25m
          memory: 100MB

- it: Test custom securityContext
  set:
    deployment.postgresExporter.securityContext:
      capabilities:
        add:
        - NET_RAW
        drop:
        - ALL
      privileged: false
      readOnlyRootFilesystem: true
      runAsNonRoot: true
      runAsUser: 1000
  asserts:
  - equal:
      path: spec.template.spec.containers[0].securityContext
      value:
        capabilities:
          add:
          - NET_RAW
          drop:
          - ALL
        privileged: false
        readOnlyRootFilesystem: true
        runAsNonRoot: true
        runAsUser: 1000

- it: Test dnsConfig
  set:
    deployment.dnsConfig:
      nameservers:
      - "8.8.8.8"
      - "8.8.4.4"
  asserts:
  - equal:
      path: spec.template.spec.dnsConfig
      value:
        nameservers:
        - "8.8.8.8"
        - "8.8.4.4"

- it: Test dnsPolicy
  set:
    deployment.dnsPolicy: ClusterFirst
  asserts:
  - equal:
      path: spec.template.spec.dnsPolicy
      value: ClusterFirst

- it: Test hostNetwork, hostname, subdomain
  set:
    deployment.hostNetwork: true
    deployment.hostname: pg-exporter
    deployment.subdomain: exporters.internal
  asserts:
  - equal:
      path: spec.template.spec.hostNetwork
      value: true
  - equal:
      path: spec.template.spec.hostname
      value: pg-exporter
  - equal:
      path: spec.template.spec.subdomain
      value: exporters.internal

- it: Test imagePullSecrets
  set:
    deployment.imagePullSecrets:
    - name: my-pull-secret
    - name: my-special-secret
  asserts:
  - equal:
      path: spec.template.spec.imagePullSecrets
      value:
      - name: my-pull-secret
      - name: my-special-secret

- it: Test nodeSelector
  set:
    deployment.nodeSelector:
      foo: bar
  asserts:
  - equal:
      path: spec.template.spec.nodeSelector
      value:
        foo: bar

- it: Test priorityClassName
  set:
    deployment.priorityClassName: my-priority
  asserts:
  - equal:
      path: spec.template.spec.priorityClassName
      value: my-priority

- it: Test restartPolicy
  set:
    deployment.restartPolicy: Always
  asserts:
  - equal:
      path: spec.template.spec.restartPolicy
      value: Always

- it: Test terminationGracePeriodSeconds
  set:
    deployment.terminationGracePeriodSeconds: 120
  asserts:
  - equal:
      path: spec.template.spec.terminationGracePeriodSeconds
      value: 120

- it: Test tolerations
  set:
    deployment.tolerations:
    - key: database/type
      operator: Equal
      value: postgres
      effect: NoSchedule
  asserts:
  - equal:
      path: spec.template.spec.tolerations
      value:
      - key: database/type
        operator: Equal
        value: postgres
        effect: NoSchedule

- it: Test topologySpreadConstraints
  set:
    deployment.topologySpreadConstraints:
    - topologyKey: kubernetes.io/hostname
      whenUnsatisfiable: DoNotSchedule
      labelSelector:
        matchLabels:
          app.kubernetes.io/instance: prometheus-postgres-exporter
  asserts:
  - equal:
      path: spec.template.spec.topologySpreadConstraints
      value:
      - topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            app.kubernetes.io/instance: prometheus-postgres-exporter

- it: Test additional volumeMounts and volumes
  set:
    deployment.postgresExporter.volumeMounts:
    - name: data
      mountPath: /usr/lib/prometheus-postgres-exporter/data
    deployment.volumes:
    - name: data
      hostPath:
        path: /usr/lib/prometheus-postgres-exporter/data
  asserts:
  - equal:
      path: spec.template.spec.containers[0].volumeMounts
      value:
      - name: data
        mountPath: /usr/lib/prometheus-postgres-exporter/data
      - name: config-d
        mountPath: /etc/prometheus-postgres-exporter/config.d
  - equal:
      path: spec.template.spec.volumes
      value:
      - name: data
        hostPath:
          path: /usr/lib/prometheus-postgres-exporter/data
      - name: config-d
        projected:
          defaultMode: 444
          sources:
          - secret:
              name: prometheus-postgres-exporter-unittest-exporter-config
          - secret:
              name: prometheus-postgres-exporter-unittest-web-config