Guelor

Guelor

I’m still new to GitHub action. I’m running a Phoenix/Elixir project, In my config file, I have the following configuration for the test:

# Set HTTPClientMock as the HTTP client for the PayService
config :sender_service, :pay_service,
  http_client: SenderService.HTTPClientMock,
  url: System.get_env("PAY_URL"),
  secret_key: System.get_env("PAY_SECRET_KEY"),
  api_key: System.get_env("PAY_API_KEY")

and this a snippet of the test:

defmodule SenderService.PayServiceTest do
  use ExUnit.Case, async: true

  alias SenderService.PayService

  import Mox

  describe "pay_service" do
    @http_client SenderService.HTTPClientMock

    test "get_balances returns a list of balances" do
      url = System.get_env("PAY_URL") <> "/v1/accounts/balances"

      list_balances_body = [
        %{
          balance: "0.00000000",
          holdAmount: "0.00000000",
          productSymbol: "USD"
        }
      ]

      expect(@http_client, :get, fn actual_url, actual_headers ->
        assert actual_url == "https://uat-pay-api.com/v1/accounts/balances"

        # Check that Authorization header is present
        authorization_header = List.keyfind(actual_headers, "Authorization", 0)
        assert authorization_header != nil

        {:ok, %HTTPoison.Response{body: list_balances_body |> Jason.encode!(), status_code: 200}}
      end)

      assert {:ok, balances} = PayService.get_balances()

      expected_balances = [
        %{
          "balance" => "0.00000000",
          "holdAmount" => "0.00000000",
          "productSymbol" => "USD"
        }
      ]

      assert expected_balances == balances

      Mox.verify!(@http_client)
    end
  end
end

which works locally with the config/test.exs file that I provide. But I’m getting the following error on GitHub action:

  1. test pay_service get_balances returns a list of balances ( SenderService.PayServiceTest)
    Error: test/sender_service/pay_service_test.exs:11
    ** (ArgumentError) construction of binary failed: segment 1 of type ‘binary’: expected a binary but got: nil
    code: url = System.get_env(“PAY_URL”) <> “/v1/accounts/balances”
    stacktrace:
    test/sender_service/pay_service_test.exs:12: (test)

I attempted to add the environment variables to both the “Actions secrets and variables” on GitHub, but I’m still encountering the error mentioned above. Am I missing something? Below are the “.yml” files for the workflow:

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: Elixir CI

on:
  push:

jobs:
  verify:
    # Set up a Postgres DB service. By default, Phoenix applications
    # use Postgres. This creates a database for running tests.
    # Additional services can be defined here if required.
    runs-on:  ubuntu-latest
    strategy:
      # Specify the OTP and Elixir versions to use when building
      # and running the workflow steps.
      matrix:
        otp: [25.0.4] # Define the OTP version [required]
        elixir: [1.14.3] # Define the elixir version [required]

    services:
      db:
        image: postgres:12
        env:
          POSTGRES_USER: postgres
          POSTGRES_PASSWORD: postgres
          POSTGRES_DB: sender_service_dev
        ports: ['5432:5432']
        options: >-
          --health-cmd pg_isready 
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
    # Step: Setup Elixir + Erlang image as the base.
      - name: Set up Elixir
        uses: erlef/setup-beam@v1
        with:
          otp-version: ${{ matrix.otp }}
          elixir-version: ${{ matrix.elixir }}
      
      # Step: Check out the code.
      - name: Checkout code
        uses: actions/checkout@v3
      
      # Step: Define how to cache deps. Restores existing cache if present.
      - name: Cache deps
        id: deps-cache
        uses: actions/cache@v3
        env:
          cache-name: cache-elixir-deps
        with:
          path: deps
          key: ${{ runner.os }}-mix-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }}
          
      # Step: Define how to cache the `_build` directory. After the first run,
      # this speeds up tests runs a lot. This includes not re-compiling our
      # project's downloaded deps every run.
      - name: Cache compiled build
        id: build-cache
        uses: actions/cache@v3
        env:
          cache-name: cache-compiled-build
        with:
          path: _build
          key: ${{ runner.os }}-build-${{ matrix.otp }}-${{ matrix.elixir }}-${{ hashFiles(format('{0}{1}', github.workspace, '/mix.lock')) }}
      
      # Step: Download project dependencies. If unchanged, uses
      # the cached version.
      - name: Install deps
        run: |
          mix deps.get
      
      # Step: Check that the checked in code has already been formatted.
      # This step fails if something was found unformatted.
      - name: Check Formatting
        run: mix format --check-formatted

      # Step: Execute the tests
      - name: Run tests 
        run: mix test

  # deploy:
  #   # only run this job if the verify job succeeds
  #   needs: verify

  #   # only run this job if the workflow is running on the master branch
  #   if: github.ref == 'refs/heads/master'

  #   runs-on: ubuntu-latest

  #   steps:
  #     - uses: actions/checkout@v2
        
  #       # actions/checkout@v2 only checks out the latest commit,
  #       # so we need to tell it to check out the entire master branch
  #       with:
  #         ref: master
  #         fetch-depth: 0

  #     # configure the gigalixir-actions with our credentials and app name
  #     - uses: mhanberg/gigalixir-action@v0.1.0
  #       with:
  #         GIGALIXIR_USERNAME: ${{ secrets.GIGALIXIR_USERNAME }}
  #         GIGALIXIR_PASSWORD: ${{ secrets.GIGALIXIR_PASSWORD }}
  #         GIGALIXIR_APP: ${{ secrets.GIGALIXIR_APP }}
  #         SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}

Any help on this would be deeply appreciated, thanks! :smiley:

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews