#!/usr/bin/env bats

load '../lib/test_helper.bash'

cd ${BATS_TEST_DIRNAME}

function setup_file() {
    check_deps
    compose_cleanup
}

function teardown_file() {
    compose_cleanup
}

@test "$(basename ${BATS_TEST_DIRNAME}): pull check" {
    run docker-compose pull
    [ "${status}" -eq 0 ]
}

@test "$(basename ${BATS_TEST_DIRNAME}): build check" {
    run docker-compose build
     [ "${status}" -eq 0 ]
}

@test "$(basename ${BATS_TEST_DIRNAME}): up check" {
    run docker-compose up -d
    [ "${status}" -eq 0  ]

}

@test "$(basename ${BATS_TEST_DIRNAME}): ports check" {

    for service in $(docker-compose ps -q); do

        # simple test to check that any exposed port has something actually listening
        # assumes format 22/tcp, 0.0.0.0:3000->3000/tcp
        ports_string=$(docker ps --filter="ID=${service}" --format "{{.Ports}}")

        OIFS=${IFS}; IFS=','; service_port=("$ports_string"); IFS=${OIFS}; unset OIFS;

        for i in "${service_port[@]}"; do

            protocol=$(expr "${i}" : '.*\(...$\)')

            # the || true here just makes sure bats doesn't fail the test because a
            # port wasn't matched. We will check for empty ports later
            port=$(expr "${i}" : '.*:\([0-9]*\)->' || true)

            if [[ ${protocol} == "tcp" ]] && [[ ! -z ${port} ]]; then
                run nc -z -v localhost "${port}"
                [ "${status}" -eq 0  ]
            elif [[ "${protocol}" = "udp" ]] && [[ ! -z ${port} ]]; then
                run nc -z -v -u localhost "${port}"
                [ "${status}" -eq 0  ]
            fi

        done
    done
}