;; Licensed to the Apache Software Foundation (ASF) under one
;; or more contributor license agreements.  See the NOTICE file
;; distributed with this work for additional information
;; regarding copyright ownership.  The ASF licenses this file
;; to you under the Apache License, Version 2.0 (the
;; "License"); you may not use this file except in compliance
;; with the License.  You may obtain a copy of the License at
;;
;;     http://www.apache.org/licenses/LICENSE-2.0
;;
;; Unless required by applicable law or agreed to in writing, software
;; distributed under the License is distributed on an "AS IS" BASIS,
;; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
;; See the License for the specific language governing permissions and
;; limitations under the License.

(ns jepsen.flink.db-test
  (:require [clojure.test :refer :all])
  (:require [jepsen.flink.db :refer :all]))

(deftest flink-configuration-test
  (testing "High availability is zookeeper by default"
    (is (= "zookeeper" (:high-availability (flink-configuration {} "n1")))))

  (testing "Default configuration can be overridden"
    (let [expected-config-value "NONE"
          custom-flink-config {:high-availability expected-config-value}
          test {:test-spec {:flink-config custom-flink-config}}]
      (is (= expected-config-value (:high-availability (flink-configuration test "n1")))))))
