#  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.

version: "3.4"
services:
  gremlin-server:
    container_name: gremlin-server
    image: tinkerpop/gremlin-server:3.5
    ports:
      - "8182:8182"
  gremlin-go-integration-tests:
    container_name: gremlin-go-integration-tests
    image: golang:1.17
    volumes:
      - .:/go_app
    environment:
      - GREMLIN_SERVER_URL=ws://gremlin-server:8182/gremlin
      - RUN_INTEGRATION_TESTS=true
    working_dir: /go_app
    command: >
      bash -c "go install github.com/haveyoudebuggedit/gotestfmt/v2/cmd/gotestfmt@latest
      && go test -v -json ./... -race -covermode=atomic -coverprofile=\"coverage.out\" | gotestfmt"
    depends_on:
      - gremlin-server
  # TODO
  gremlin-go-godog-tests:
    container_name: gremlin-go-godog-tests
    image: golang:1.17
    volumes:
      - .:/go_app
      - ./../gremlin-test:/var/gremlin-test
    environment:
      - GREMLIN_SERVER_URL=ws://gremlin-server:8182/gremlin
      - RUN_INTEGRATION_TESTS=true
    working_dir: /go_app
    command: >
      bash -c "go get github.com/cucumber/godog/cmd/godog
      && cd cucumber
      && godog /var/gremlin-test/features"
    depends_on:
      - gremlin-server
