From 3b5047ac417cb501b11d18debccbf333abfc294d Mon Sep 17 00:00:00 2001 From: vtm Date: Fri, 21 Feb 2025 17:57:31 +0100 Subject: [PATCH 1/3] Improve CI --- .github/workflows/master.yml | 46 ++++++++++++++++++++++++------------ .github/workflows/pr.yml | 43 ++++++++++++++++++++------------- 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 75f4fabb1..1c2b36fcc 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -4,14 +4,17 @@ on: push: branches: - master + workflow_dispatch: + jobs: build: if: github.repository == 'hexlet-codebattle/codebattle' runs-on: ubuntu-latest + timeout-minutes: 30 # Add timeout to prevent hanging builds - # Use test environment by default env: MIX_ENV: test + DOCKER_BUILDKIT: 1 # Enable buildkit for faster docker builds services: db: @@ -19,6 +22,7 @@ jobs: ports: ["5432:5432"] env: POSTGRES_PASSWORD: postgres + POSTGRES_HOST_AUTH_METHOD: trust # Simplify auth for CI options: >- --health-cmd pg_isready --health-interval 10s @@ -29,6 +33,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 # Fetch complete history for better caching - name: Setup Elixir uses: erlef/setup-beam@v1 @@ -51,7 +57,10 @@ jobs: restore-keys: ${{ runner.os }}-build- - name: Get deps - run: mix deps.get + run: | + mix local.hex --force + mix local.rebar --force + mix deps.get working-directory: ./services/app - name: Mix deps.compile @@ -68,7 +77,7 @@ jobs: - name: Get yarn cache id: yarn-cache - run: echo "::set-output name=dir::$(yarn cache dir)" + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - uses: actions/cache@v4 with: @@ -78,7 +87,7 @@ jobs: ${{ runner.os }}-yarn- - name: Install yarn dependencies - run: yarn install --froze-lockfile + run: yarn install --frozen-lockfile --network-timeout 300000 working-directory: ./services/app/apps/codebattle - name: Eslint @@ -97,23 +106,30 @@ jobs: run: make test - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} file: ./services/app/assp/codebattle/cover/excoveralls.json fail_ci_if_error: false - name: Login to Docker Hub - run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - - - name: Build docker image for codebattle - run: make GIT_HASH=${{ github.sha }} docker-build-codebattle - - name: Push docker image for codebattle - run: make docker-push-codebattle - - name: Build docker image for runner - run: make docker-build-runner - - name: Push docker image for runner - run: make docker-push-runner + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push codebattle image + run: | + make GIT_HASH=${{ github.sha }} docker-build-codebattle + make docker-push-codebattle + + - name: Build and push runner image + run: | + make docker-build-runner + make docker-push-runner # stop integratoin tests on CI becaues of https://github.com/hexlet-codebattle/codebattle/runs/580337561?check_suite_focus=true # - name: Pull dockers diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 71ece1763..ac8a23c36 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -4,20 +4,27 @@ on: pull_request: branches: - master + workflow_dispatch: + jobs: build: runs-on: ubuntu-latest + concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + # Use test environment by default env: MIX_ENV: test + POSTGRES_PASSWORD: postgres services: db: image: postgres:16-alpine ports: ["5432:5432"] env: - POSTGRES_PASSWORD: postgres + POSTGRES_PASSWORD: ${{ env.POSTGRES_PASSWORD }} options: >- --health-cmd pg_isready --health-interval 10s @@ -28,6 +35,8 @@ jobs: steps: - uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Setup Elixir uses: erlef/setup-beam@v1 @@ -35,21 +44,19 @@ jobs: otp-version: "27.2" elixir-version: "1.18.2" - - name: Restore mix build cache + - name: Cache Dependencies uses: actions/cache@v4 + id: deps-cache with: - path: ./services/app/deps - key: ${{ runner.os }}-deps-${{ hashFiles('**/mix.lock') }} - restore-keys: ${{ runner.os }}-deps- - - - name: Restore Build Cache - uses: actions/cache@v4 - with: - path: ./services/app/_build - key: ${{ runner.os }}-build-${{ hashFiles('**/mix.lock') }} - restore-keys: ${{ runner.os }}-build- + path: | + ./services/app/deps + ./services/app/_build + key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }} + restore-keys: | + ${{ runner.os }}-mix- - name: Get deps + if: steps.deps-cache.outputs.cache-hit != 'true' run: mix deps.get working-directory: ./services/app @@ -62,12 +69,12 @@ jobs: working-directory: ./services/app - name: Mix credo - run: mix credo + run: mix credo --strict working-directory: ./services/app - name: Get yarn cache id: yarn-cache - run: echo "::set-output name=dir::$(yarn cache dir)" + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - uses: actions/cache@v4 with: @@ -77,7 +84,7 @@ jobs: ${{ runner.os }}-yarn- - name: Install yarn dependencies - run: yarn install --froze-lockfile + run: yarn install --frozen-lockfile working-directory: ./services/app/apps/codebattle - name: Eslint @@ -89,14 +96,16 @@ jobs: working-directory: ./services/app/apps/codebattle - name: Setup db - run: mix ecto.create && mix ecto.migrate + run: | + mix ecto.create + mix ecto.migrate working-directory: ./services/app - name: Mix tests run: make test - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} file: ./services/app/assp/codebattle/cover/excoveralls.json From 070c0d92b613a3b7e9b10f2633afb5dea4d42d9b Mon Sep 17 00:00:00 2001 From: vtm Date: Fri, 21 Feb 2025 18:22:03 +0100 Subject: [PATCH 2/3] Fix styler --- services/app/.credo.exs | 4 +- services/app/.formatter.exs | 2 +- services/app/.iex.exs | 8 +- services/app/apps/codebattle/.formatter.exs | 2 +- .../codebattle/lib/codebattle/application.ex | 6 +- .../lib/codebattle/asserts/executor/remote.ex | 6 +- .../lib/codebattle/asserts/output_parser.ex | 8 +- .../lib/codebattle/asserts/result.ex | 8 +- .../lib/codebattle/asserts/token.ex | 1 + .../lib/codebattle/asserts_service.ex | 12 +- .../codebattle/lib/codebattle/auth/discord.ex | 14 +- .../lib/codebattle/auth/discord_mock.ex | 20 +- .../lib/codebattle/auth/discord_user.ex | 4 +- .../lib/codebattle/auth/firebase_user.ex | 25 +-- .../codebattle/lib/codebattle/auth/github.ex | 24 +-- .../lib/codebattle/auth/github_mock.ex | 29 +-- .../lib/codebattle/auth/github_user.ex | 2 +- .../lib/codebattle/auth/token_user.ex | 4 +- .../codebattle/lib/codebattle/auth/user.ex | 7 +- .../lib/codebattle/bot/chat_client.ex | 48 ++--- .../lib/codebattle/bot/game_creator.ex | 9 +- .../lib/codebattle/bot/playbook_player.ex | 41 ++-- .../codebattle/lib/codebattle/bot/server.ex | 23 +-- .../lib/codebattle/bot/supervisor.ex | 3 +- .../codebattle/lib/codebattle/chat/chat.ex | 1 + .../codebattle/lib/codebattle/chat/message.ex | 2 + .../codebattle/lib/codebattle/chat/server.ex | 14 +- .../codebattle/lib/codebattle/cheat_check.ex | 32 +-- .../apps/codebattle/lib/codebattle/clan.ex | 2 +- .../codebattle/lib/codebattle/clan/scope.ex | 4 +- .../codebattle/lib/codebattle/code_check.ex | 1 + .../codebattle/code_check/assert_result.ex | 4 +- .../lib/codebattle/code_check/checker.ex | 1 + .../codebattle/code_check/executor/fake.ex | 4 +- .../code_check/executor/remote_docker_run.ex | 8 +- .../code_check/executor/remote_rust.ex | 8 +- .../codebattle/code_check/output_parser.ex | 5 +- .../codebattle/code_check/output_parser_v2.ex | 20 +- .../lib/codebattle/code_check/result.ex | 1 + .../lib/codebattle/code_check/result_v2.ex | 8 +- .../lib/codebattle/code_check/token.ex | 1 + .../lib/codebattle/customization.ex | 2 + .../lib/codebattle/event/event_clan_result.ex | 7 +- .../lib/codebattle/event/event_result.ex | 7 +- .../codebattle/lib/codebattle/feedback.ex | 7 +- .../codebattle/lib/codebattle/forms/task.ex | 18 +- .../lib/codebattle/forms/task_pack.ex | 7 +- .../apps/codebattle/lib/codebattle/game.ex | 5 +- .../codebattle/lib/codebattle/game/auth.ex | 18 +- .../codebattle/lib/codebattle/game/context.ex | 26 ++- .../codebattle/lib/codebattle/game/elo.ex | 6 +- .../codebattle/lib/codebattle/game/engine.ex | 53 ++--- .../game/fake_tasks_queues_server.ex | 1 + .../codebattle/lib/codebattle/game/fsm.ex | 42 ++-- .../lib/codebattle/game/global_supervisor.ex | 11 +- .../codebattle/lib/codebattle/game/helpers.ex | 38 ++-- .../codebattle/lib/codebattle/game/player.ex | 25 +-- .../codebattle/lib/codebattle/game/query.ex | 7 +- .../lib/codebattle/game/rating_calculator.ex | 15 +- .../codebattle/lib/codebattle/game/server.ex | 6 +- .../lib/codebattle/game/supervisor.ex | 10 +- .../codebattle/game/tasks_queues_server.ex | 2 +- .../lib/codebattle/game/timeout_server.ex | 11 +- .../apps/codebattle/lib/codebattle/invite.ex | 31 +-- .../lib/codebattle/invites_killer_server.ex | 5 +- .../codebattle/lib/codebattle/playbook.ex | 3 +- .../lib/codebattle/playbook/context.ex | 82 +++----- .../lib/codebattle/premium_request.ex | 5 +- .../apps/codebattle/lib/codebattle/pub_sub.ex | 1 + .../lib/codebattle/pub_sub/events.ex | 1 + .../apps/codebattle/lib/codebattle/repo.ex | 3 +- .../apps/codebattle/lib/codebattle/task.ex | 16 +- .../codebattle/lib/codebattle/task_pack.ex | 6 +- .../lib/codebattle/tasks_importer.ex | 15 +- .../lib/codebattle/tournament/clans.ex | 1 + .../lib/codebattle/tournament/context.ex | 41 ++-- .../tournament/global_supervisor.ex | 16 +- .../lib/codebattle/tournament/helpers.ex | 50 ++--- .../lib/codebattle/tournament/match.ex | 1 + .../tournament/pair_builder/by_clan.ex | 10 +- .../pair_builder/by_clan_and_score.ex | 11 +- .../tournament/pair_builder/by_score.ex | 1 + .../lib/codebattle/tournament/player.ex | 6 +- .../lib/codebattle/tournament/ranking.ex | 7 +- .../codebattle/tournament/ranking/by_clan.ex | 1 + .../tournament/ranking/by_player.ex | 1 + .../ranking/by_player_95th_percentile.ex | 7 +- .../ranking/update_from_results_server.ex | 33 ++- .../lib/codebattle/tournament/ranking/void.ex | 1 + .../lib/codebattle/tournament/round.ex | 12 +- .../codebattle/tournament/round/context.ex | 34 ++-- .../lib/codebattle/tournament/server.ex | 162 ++++++--------- .../codebattle/tournament/storage/clans.ex | 3 +- .../codebattle/tournament/storage/matches.ex | 1 + .../codebattle/tournament/storage/players.ex | 1 + .../codebattle/tournament/storage/ranking.ex | 1 + .../codebattle/tournament/storage/tasks.ex | 1 + .../codebattle/tournament/strategy/arena.ex | 15 +- .../codebattle/tournament/strategy/base.ex | 112 +++++----- .../tournament/strategy/individual.ex | 5 +- .../codebattle/tournament/strategy/show.ex | 3 +- .../codebattle/tournament/strategy/squad.ex | 5 +- .../codebattle/tournament/strategy/swiss.ex | 15 +- .../codebattle/tournament/strategy/team.ex | 3 +- .../codebattle/tournament/strategy/versus.ex | 1 + .../lib/codebattle/tournament/supervisor.ex | 5 +- .../codebattle/tournament/task_provider.ex | 32 +-- .../lib/codebattle/tournament/tournament.ex | 3 +- .../tournament/tournament_result.ex | 13 +- .../apps/codebattle/lib/codebattle/user.ex | 15 +- .../lib/codebattle/user/achievements.ex | 19 +- .../codebattle/lib/codebattle/user/scope.ex | 12 +- .../lib/codebattle/user/sound_settings.ex | 2 + .../codebattle/lib/codebattle/user/stats.ex | 17 +- .../codebattle/lib/codebattle/user_game.ex | 4 +- .../lib/codebattle/user_game_report.ex | 3 +- .../codebattle/users_rank_update_server.ex | 4 +- .../lib/codebattle/utils/populate_users.ex | 8 +- .../lib/codebattle/waiting_room/engine.ex | 24 +-- .../lib/codebattle/waiting_room/server.ex | 9 +- .../lib/codebattle/waiting_room/state.ex | 1 + .../codebattle/waiting_room/waiting_room.ex | 1 + .../app/apps/codebattle/lib/codebattle_web.ex | 38 ++-- .../codebattle_web/channels/chat_channel.ex | 12 +- .../codebattle_web/channels/game_channel.ex | 8 +- .../codebattle_web/channels/invite_channel.ex | 8 +- .../codebattle_web/channels/lobby_channel.ex | 3 +- .../codebattle_web/channels/main_channel.ex | 6 +- .../channels/spectator_channel.ex | 2 +- .../channels/tournament_admin_channel.ex | 14 +- .../channels/tournament_channel.ex | 6 +- .../codebattle_web/channels/user_socket.ex | 4 +- .../controllers/api/v1/activity_controller.ex | 4 +- .../api/v1/event/leaderboard_controller.ex | 10 +- .../controllers/api/v1/feedback_controller.ex | 8 +- .../api/v1/game_activity_controller.ex | 4 +- .../controllers/api/v1/playbook_controller.ex | 16 +- .../controllers/api/v1/task_controller.ex | 21 +- .../api/v1/tournament_controller.ex | 9 +- .../controllers/api/v1/user_controller.ex | 4 +- .../api/v1/user_game_report_controller.ex | 7 +- .../controllers/auth_bind_controller.ex | 65 +++--- .../controllers/auth_controller.ex | 64 +++--- .../controllers/dev_login_controller.ex | 4 +- .../controllers/event_controller.ex | 4 +- .../ext_api/executor_controller.ex | 16 +- .../controllers/ext_api/user_controller.ex | 7 +- .../controllers/fallback_controller.ex | 3 +- .../controllers/game/image_controller.ex | 4 +- .../controllers/game_controller.ex | 7 +- .../live_view_tournament_controller.ex | 3 +- .../controllers/public_event_controller.ex | 4 +- .../controllers/raw_task_controller.ex | 6 +- .../controllers/task_controller.ex | 12 +- .../tournament/admin_controller.ex | 2 +- .../tournament/image_controller.ex | 2 +- .../controllers/tournament_controller.ex | 1 + .../live/components/tournament/create_form.ex | 2 + .../live/components/tournament/edit_form.ex | 2 + .../live/event/leaderboard_view.ex | 1 - .../live/tournament/edit_view.ex | 12 +- .../live/tournament/index_view.ex | 12 +- .../live/tournament/timer_view.ex | 2 +- .../lib/codebattle_web/plugs/admin_only.ex | 5 +- .../codebattle_web/plugs/api_require_auth.ex | 5 +- .../plugs/assign_current_user.ex | 7 +- .../lib/codebattle_web/plugs/cors.ex | 1 + .../codebattle_web/plugs/force_redirect.ex | 3 +- .../lib/codebattle_web/plugs/locale.ex | 5 +- .../lib/codebattle_web/plugs/require_auth.ex | 5 +- .../lib/codebattle_web/plugs/token_auth.ex | 5 +- .../codebattle/lib/codebattle_web/presence.ex | 1 + .../codebattle/lib/codebattle_web/router.ex | 21 +- .../lib/codebattle_web/telemetry.ex | 2 + .../lib/codebattle_web/views/api/game_view.ex | 6 +- .../lib/codebattle_web/views/api/user_view.ex | 6 +- .../lib/codebattle_web/views/error_view.ex | 2 +- .../lib/codebattle_web/views/event_view.ex | 4 +- .../lib/codebattle_web/views/game_view.ex | 4 +- .../lib/codebattle_web/views/layout_view.ex | 3 +- .../lib/codebattle_web/views/raw_task_view.ex | 2 +- .../lib/codebattle_web/views/root_view.ex | 17 +- .../lib/codebattle_web/views/session_view.ex | 2 +- .../lib/codebattle_web/views/task_view.ex | 2 +- .../codebattle_web/views/tournament_view.ex | 8 +- .../lib/codebattle_web/views/user_view.ex | 2 +- .../app/apps/codebattle/lib/ecto_map_set.ex | 10 +- services/app/apps/codebattle/lib/encoder.ex | 1 + .../codebattle/lib/mix/get_contributors.ex | 20 +- .../lib/mix/tasks/asserts/upload.ex | 4 +- .../app/apps/codebattle/lib/time_helper.ex | 1 + services/app/apps/codebattle/lib/utils.ex | 3 +- services/app/apps/codebattle/mix.exs | 1 + .../app/apps/codebattle/priv/repo/seeds.exs | 19 +- .../codebattle/bot/playbook_player_test.exs | 8 +- .../codebattle/bot/playbook_store_test.exs | 8 +- .../codebattle/test/codebattle/chat_test.exs | 9 +- .../code_check/output_parser_v2_test.exs | 29 +-- .../test/codebattle/game/context_test.exs | 7 +- .../game/tasks_queues_server_test.exs | 7 +- .../test/codebattle/tasks_importer_test.exs | 20 +- .../test/codebattle/tournament/arena_test.exs | 4 +- .../arena_clan_seq_task_win_loss_test.exs | 53 ++--- ..._with_clan_seq_task_95_percentile_test.exs | 109 +++++----- .../entire/squad_seq_task_one_zero_test.exs | 141 ++++++------- .../test/codebattle/tournament/team_test.exs | 4 +- .../test/codebattle/user/rank_update_test.exs | 38 +--- .../test/codebattle/user/scope_test.exs | 2 +- .../codebattle/waiting_room/enginge_test.exs | 5 +- .../channels/chat_channel_test.exs | 10 +- .../channels/game_channel_test.exs | 16 +- .../channels/invite_channel_test.exs | 22 +- .../channels/lobby_channel_test.exs | 17 +- .../channels/main_channel_test.exs | 16 +- .../api/v1/activity_controller_test.exs | 3 +- .../api/v1/game_activity_controller_test.exs | 7 +- .../api/v1/game_controller_test.exs | 4 +- .../api/v1/task_controller_test.exs | 12 +- .../api/v1/user_controller_test.exs | 18 +- .../v1/user_game_report_controller_test.exs | 6 +- .../controllers/auth_bind_controller_test.exs | 4 +- .../ext_api/user_controller_test.exs | 16 +- .../controllers/feedback_controller_test.exs | 4 +- .../controllers/game_controller_test.exs | 1 + .../controllers/image_controller_test.exs | 12 +- .../controllers/task_controller_test.exs | 4 +- .../controllers/user_controller_test.exs | 16 +- .../integration/game/give_up_test.exs | 2 +- .../game/recalculate_achivements_test.exs | 5 +- .../integration/game/rematch_test.exs | 5 +- .../integration/game/standard_game_test.exs | 40 ++-- .../integration/game/timeout_test.exs | 5 +- .../arena_clan_95_percentile_test.exs | 51 +++-- .../tournament/arena_clan_test.exs | 51 +++-- .../test/docker_execution/clojure_test.exs | 14 +- .../test/docker_execution/cpp_test.exs | 16 +- .../test/docker_execution/csharp_test.exs | 17 +- .../test/docker_execution/dart_test.exs | 16 +- .../test/docker_execution/elixir_test.exs | 14 +- .../test/docker_execution/golang_test.exs | 14 +- .../test/docker_execution/haskell_test.exs | 20 +- .../test/docker_execution/java_test.exs | 19 +- .../test/docker_execution/js_test.exs | 14 +- .../test/docker_execution/kotlin_test.exs | 16 +- .../test/docker_execution/php_test.exs | 12 +- .../test/docker_execution/python_test.exs | 14 +- .../test/docker_execution/ruby_test.exs | 16 +- .../test/docker_execution/ts_test.exs | 20 +- .../codebattle/test/support/channel_case.ex | 8 +- .../apps/codebattle/test/support/conn_case.ex | 15 +- .../apps/codebattle/test/support/data_case.ex | 6 +- .../apps/codebattle/test/support/factory.ex | 1 + .../test/support/integration_case.ex | 18 +- .../codebattle/test/support/oauth_helpers.ex | 1 + .../test/support/tournament_test_helpers.ex | 1 + .../lib/runner/stale_containers_killer.ex | 4 +- .../lib/runner/system_monitor_logger.ex | 2 +- .../test/runner/solution_generator_test.exs | 2 +- services/app/config/config.exs | 155 +++++++------- services/app/config/dev.exs | 54 ++--- services/app/config/prod.exs | 26 +-- services/app/config/releases.exs | 191 +++++++++--------- services/app/config/test.exs | 111 +++++----- services/app/mix.lock | 1 + services/app/priv/repo/seeds.exs | 7 +- 265 files changed, 1803 insertions(+), 2060 deletions(-) diff --git a/services/app/.credo.exs b/services/app/.credo.exs index 29eb88eb8..b257a01e5 100644 --- a/services/app/.credo.exs +++ b/services/app/.credo.exs @@ -23,7 +23,7 @@ # {Credo.Check.Consistency.ExceptionNames, []}, {Credo.Check.Consistency.LineEndings, []}, - {Credo.Check.Consistency.ParameterPatternMatching, []}, + {Credo.Check.Consistency.ParameterPatternMatching, false}, {Credo.Check.Consistency.SpaceAroundOperators, []}, {Credo.Check.Consistency.SpaceInParentheses, []}, {Credo.Check.Consistency.TabsOrSpaces, []}, @@ -35,7 +35,7 @@ # Priority values are: `low, normal, high, higher` # {Credo.Check.Design.AliasUsage, - [priority: :low, if_nested_deeper_than: 2, if_called_more_often_than: 0]}, + [priority: :low, if_nested_deeper_than: 4, if_called_more_often_than: 0]}, # You can also customize the exit_status of each check. # If you don't want TODO comments to cause `mix credo` to fail, just # set this value to 0 (zero). diff --git a/services/app/.formatter.exs b/services/app/.formatter.exs index 155f76245..b67036447 100644 --- a/services/app/.formatter.exs +++ b/services/app/.formatter.exs @@ -1,6 +1,6 @@ # Used by "mix format" [ - plugins: [Phoenix.LiveView.HTMLFormatter], + plugins: [Styler, Phoenix.LiveView.HTMLFormatter], inputs: ["*.{heex,ex,exs}", "priv/*/seeds.exs", "{config,lib,test}/**/*.{heex,ex,exs}"], subdirectories: ["apps/*"] ] diff --git a/services/app/.iex.exs b/services/app/.iex.exs index 27e5a89c0..1d8fda51b 100644 --- a/services/app/.iex.exs +++ b/services/app/.iex.exs @@ -1,13 +1,13 @@ +import Ecto.Changeset +import Ecto.Query + alias Codebattle.Bot alias Codebattle.Bot.Playbook alias Codebattle.Chat alias Codebattle.Game -alias Codebattle.UserGameReport alias Codebattle.Repo alias Codebattle.TaskPack alias Codebattle.Tournament alias Codebattle.User alias Codebattle.UserGame - -import Ecto.Query -import Ecto.Changeset +alias Codebattle.UserGameReport diff --git a/services/app/apps/codebattle/.formatter.exs b/services/app/apps/codebattle/.formatter.exs index 52deca87a..500a96bad 100644 --- a/services/app/apps/codebattle/.formatter.exs +++ b/services/app/apps/codebattle/.formatter.exs @@ -2,6 +2,6 @@ [ import_deps: [:ecto, :ecto_sql, :phoenix], subdirectories: ["priv/*/migrations"], - plugins: [Phoenix.LiveView.HTMLFormatter], + plugins: [Styler, Phoenix.LiveView.HTMLFormatter], inputs: ["*.{heex,ex,exs}", "{config,lib,test}/**/*.{heex,ex,exs}", "priv/*/seeds.exs"] ] diff --git a/services/app/apps/codebattle/lib/codebattle/application.ex b/services/app/apps/codebattle/lib/codebattle/application.ex index 1e1bb03b2..c7e3b7e12 100644 --- a/services/app/apps/codebattle/lib/codebattle/application.ex +++ b/services/app/apps/codebattle/lib/codebattle/application.ex @@ -8,11 +8,11 @@ defmodule Codebattle.Application do def start(_type, _args) do if Application.get_env(:codebattle, :load_dot_env_file) do root_dir = @app_dir |> Path.join("../../../../") |> Path.expand() - config_path = Mix.Project.config() |> Keyword.get(:config_path) + config_path = Keyword.get(Mix.Project.config(), :config_path) env_path = Path.join(root_dir, ".env") Envy.load([env_path]) - Config.Reader.read!(config_path) |> Application.put_all_env() + config_path |> Config.Reader.read!() |> Application.put_all_env() end github_tasks = @@ -61,7 +61,7 @@ defmodule Codebattle.Application do {Codebattle.InvitesKillerServer, []}, %{ id: Codebattle.Chat.Lobby, - start: {Codebattle.Chat, :start_link, [:lobby, %{message_ttl: :timer.hours(8)}]} + start: {Codebattle.Chat, :start_link, [:lobby, %{message_ttl: to_timeout(hour: 8)}]} } ] ++ github_tasks ++ bot_games ++ user_rank diff --git a/services/app/apps/codebattle/lib/codebattle/asserts/executor/remote.ex b/services/app/apps/codebattle/lib/codebattle/asserts/executor/remote.ex index f7fef0b82..cef603295 100644 --- a/services/app/apps/codebattle/lib/codebattle/asserts/executor/remote.ex +++ b/services/app/apps/codebattle/lib/codebattle/asserts/executor/remote.ex @@ -1,10 +1,10 @@ defmodule Codebattle.AssertsService.Executor.Remote do @moduledoc false - require Logger - - alias Runner.AtomizedMap alias Codebattle.AssertsService.Executor.Token + alias Runner.AtomizedMap + + require Logger @spec call(Token.t()) :: Token.t() def call(token) do diff --git a/services/app/apps/codebattle/lib/codebattle/asserts/output_parser.ex b/services/app/apps/codebattle/lib/codebattle/asserts/output_parser.ex index 322bbf732..07e83ad7c 100644 --- a/services/app/apps/codebattle/lib/codebattle/asserts/output_parser.ex +++ b/services/app/apps/codebattle/lib/codebattle/asserts/output_parser.ex @@ -1,12 +1,12 @@ defmodule Codebattle.AssertsService.OutputParser do @moduledoc "Parse container output for representing check status of solution" - require Logger - alias Codebattle.AssertsService.AssertResult alias Codebattle.AssertsService.Result alias Runner.AtomizedMap + require Logger + def call(checker_token) do %{container_output: container_output, exit_code: exit_code} = checker_token @@ -21,7 +21,7 @@ defmodule Codebattle.AssertsService.OutputParser do |> Map.get(:execution_result) end - defp parse_output(token = %{exit_code: 0}) do + defp parse_output(%{exit_code: 0} = token) do %{token | execution_result: Jason.decode!(token.container_output)} rescue _e -> @@ -87,7 +87,7 @@ defmodule Codebattle.AssertsService.OutputParser do } end - defp parse_assert_result(item = %{"type" => "result"}) do + defp parse_assert_result(%{"type" => "result"} = item) do status = if AtomizedMap.atomize(item["actual"]) == AtomizedMap.atomize(item["expected"]) do "success" diff --git a/services/app/apps/codebattle/lib/codebattle/asserts/result.ex b/services/app/apps/codebattle/lib/codebattle/asserts/result.ex index f39c9f236..ab307bd6e 100644 --- a/services/app/apps/codebattle/lib/codebattle/asserts/result.ex +++ b/services/app/apps/codebattle/lib/codebattle/asserts/result.ex @@ -1,8 +1,4 @@ defmodule Codebattle.AssertsService.Result do - use TypedStruct - - alias Codebattle.AssertsService.AssertResult - @moduledoc """ statuses: initial -> no generation runs @@ -12,6 +8,10 @@ defmodule Codebattle.AssertsService.Result do error -> compile error, or out of memory """ + use TypedStruct + + alias Codebattle.AssertsService.AssertResult + @derive Jason.Encoder typedstruct do diff --git a/services/app/apps/codebattle/lib/codebattle/asserts/token.ex b/services/app/apps/codebattle/lib/codebattle/asserts/token.ex index d8ac2928f..f287381f7 100644 --- a/services/app/apps/codebattle/lib/codebattle/asserts/token.ex +++ b/services/app/apps/codebattle/lib/codebattle/asserts/token.ex @@ -1,4 +1,5 @@ defmodule Codebattle.AssertsService.Executor.Token do + @moduledoc false use TypedStruct alias Codebattle.AssertsService diff --git a/services/app/apps/codebattle/lib/codebattle/asserts_service.ex b/services/app/apps/codebattle/lib/codebattle/asserts_service.ex index 2ff9dbccb..2e7e0273b 100644 --- a/services/app/apps/codebattle/lib/codebattle/asserts_service.ex +++ b/services/app/apps/codebattle/lib/codebattle/asserts_service.ex @@ -3,13 +3,13 @@ defmodule Codebattle.AssertsService do Asserts service for tasks (validation and generation). """ - require Logger - - alias Runner.Languages alias Codebattle.AssertsService.Executor alias Codebattle.AssertsService.Executor.Token alias Codebattle.AssertsService.OutputParser alias Codebattle.AssertsService.Result + alias Runner.Languages + + require Logger @type executor :: Executor.Local | Executor.Fake | Executor.Remote @@ -68,7 +68,7 @@ defmodule Codebattle.AssertsService do def valid_asserts?(asserts, dest) do typed_asserts = type_asserts(asserts) - prepared_dest = dest |> Enum.map(&Map.delete(&1, "argument-name")) + prepared_dest = Enum.map(dest, &Map.delete(&1, "argument-name")) typed_asserts == prepared_dest end @@ -78,11 +78,11 @@ defmodule Codebattle.AssertsService do """ @spec type_asserts([any()]) :: any() def type_asserts(asserts) do - asserts |> Enum.map(&get_type/1) + Enum.map(asserts, &get_type/1) end defp get_type(element) when is_map(element) do - value = element |> Map.values() |> hd + value = element |> Map.values() |> hd() %{"name" => "hash", "nested" => get_type(value)} end diff --git a/services/app/apps/codebattle/lib/codebattle/auth/discord.ex b/services/app/apps/codebattle/lib/codebattle/auth/discord.ex index 09284ee24..d3872eef1 100644 --- a/services/app/apps/codebattle/lib/codebattle/auth/discord.ex +++ b/services/app/apps/codebattle/lib/codebattle/auth/discord.ex @@ -47,9 +47,10 @@ defmodule Codebattle.Auth.Discord do """ def discord_auth(code, redirect_uri) do opts = - Keyword.merge( + Keyword.put( Application.get_env(:codebattle, :auth_req_options, []), - form: %{ + :form, + %{ client_id: client_id(), client_secret: client_secret(), grant_type: "authorization_code", @@ -73,12 +74,11 @@ defmodule Codebattle.Auth.Discord do defp get_user_details(access_token) do opts = - Keyword.merge( + Keyword.put( Application.get_env(:codebattle, :auth_req_options, []), - headers: [ - "user-agent": "Codebattle", - authorization: "Bearer #{access_token}" - ] + :headers, + "user-agent": "Codebattle", + authorization: "Bearer #{access_token}" ) @discord_user_url diff --git a/services/app/apps/codebattle/lib/codebattle/auth/discord_mock.ex b/services/app/apps/codebattle/lib/codebattle/auth/discord_mock.ex index 004a61478..896d6b507 100644 --- a/services/app/apps/codebattle/lib/codebattle/auth/discord_mock.ex +++ b/services/app/apps/codebattle/lib/codebattle/auth/discord_mock.ex @@ -48,25 +48,11 @@ defmodule Codebattle.Auth.DiscordMock do def get!(url, headers \\ [], options \\ []) - def get!( - "https://discord.com/api/users/@me", - [ - {"User-Agent", "Codebattle"}, - {"Authorization", "Bearer 123"} - ], - _options - ) do - %{body: "{\"error\": \"test error\"}"} + def get!("https://discord.com/api/users/@me", [{"User-Agent", "Codebattle"}, {"Authorization", "Bearer 123"}], _options) do + %{body: ~s({"error": "test error"})} end - def get!( - "https://discord.com/api/users/@me", - [ - {"User-Agent", "Codebattle"}, - {"Authorization", "Bearer 42"} - ], - _options - ) do + def get!("https://discord.com/api/users/@me", [{"User-Agent", "Codebattle"}, {"Authorization", "Bearer 42"}], _options) do %{body: @body_email_nil} end diff --git a/services/app/apps/codebattle/lib/codebattle/auth/discord_user.ex b/services/app/apps/codebattle/lib/codebattle/auth/discord_user.ex index 7f90afb8a..41d22e3e0 100644 --- a/services/app/apps/codebattle/lib/codebattle/auth/discord_user.ex +++ b/services/app/apps/codebattle/lib/codebattle/auth/discord_user.ex @@ -34,7 +34,7 @@ defmodule Codebattle.Auth.User.DiscordUser do @spec bind(User.t(), map()) :: {:ok, User.t()} | {:error, :term} def bind(user, profile) do - discord_user = User |> Repo.get_by(discord_id: profile.id) + discord_user = Repo.get_by(User, discord_id: profile.id) if discord_user != nil && discord_user.id != user.id do {:error, "discord_id has been taken"} @@ -74,7 +74,7 @@ defmodule Codebattle.Auth.User.DiscordUser do end defp generate_unique_name(name) do - new_name = "#{name}_#{:crypto.strong_rand_bytes(2) |> Base.encode16()}" + new_name = "#{name}_#{2 |> :crypto.strong_rand_bytes() |> Base.encode16()}" case Repo.get_by(User, name: new_name) do %User{} -> diff --git a/services/app/apps/codebattle/lib/codebattle/auth/firebase_user.ex b/services/app/apps/codebattle/lib/codebattle/auth/firebase_user.ex index adc7f8aad..8f8213b0a 100644 --- a/services/app/apps/codebattle/lib/codebattle/auth/firebase_user.ex +++ b/services/app/apps/codebattle/lib/codebattle/auth/firebase_user.ex @@ -2,9 +2,10 @@ defmodule Codebattle.Auth.User.FirebaseUser do @moduledoc """ Basic user/password registration """ - require Logger + alias Codebattle.Repo + alias Codebattle.User - alias Codebattle.{Repo, User} + require Logger def find(user_attrs) do case find_in_firebase(user_attrs) do @@ -20,12 +21,8 @@ defmodule Codebattle.Auth.User.FirebaseUser do def create(user_attrs) do with :ok <- check_existed_user(user_attrs), - {:ok, firebase_uid} <- create_in_firebase(user_attrs), - {:ok, user} <- create_in_db(user_attrs, firebase_uid) do - {:ok, user} - else - {:error, reason} -> - {:error, reason} + {:ok, firebase_uid} <- create_in_firebase(user_attrs) do + create_in_db(user_attrs, firebase_uid) end end @@ -33,7 +30,7 @@ defmodule Codebattle.Auth.User.FirebaseUser do reset_in_firebase(user_attrs) end - defp check_existed_user(user_attrs = %{name: name, email: email}) do + defp check_existed_user(%{name: name, email: email} = user_attrs) do existed_users = User |> User.Scope.by_email_or_name(user_attrs) @@ -57,9 +54,7 @@ defmodule Codebattle.Auth.User.FirebaseUser do json: %{email: email, password: password} ) do {:ok, %Req.Response{status: 200, body: body}} -> - firebase_uid = - body - |> Map.get("localId") + firebase_uid = Map.get(body, "localId") {:ok, firebase_uid} @@ -85,9 +80,7 @@ defmodule Codebattle.Auth.User.FirebaseUser do json: %{email: email, password: password, returnSecureToken: true} ) do {:ok, %Req.Response{status: 200, body: body}} -> - firebase_uid = - body - |> Map.get("localId") + firebase_uid = Map.get(body, "localId") {:ok, firebase_uid} @@ -160,7 +153,7 @@ defmodule Codebattle.Auth.User.FirebaseUser do end defp gravatar_url(email) do - hash = :erlang.md5(email) |> Base.encode16(case: :lower) + hash = email |> :erlang.md5() |> Base.encode16(case: :lower) "https://gravatar.com/avatar/#{hash}?d=identicon" end diff --git a/services/app/apps/codebattle/lib/codebattle/auth/github.ex b/services/app/apps/codebattle/lib/codebattle/auth/github.ex index 60846acc3..10c53e7cf 100644 --- a/services/app/apps/codebattle/lib/codebattle/auth/github.ex +++ b/services/app/apps/codebattle/lib/codebattle/auth/github.ex @@ -53,33 +53,32 @@ defmodule Codebattle.Auth.Github do }) opts = - Keyword.merge( + Keyword.put( Application.get_env(:codebattle, :auth_req_options, []), - headers: ["content-type": "application/x-www-form-urlencoded"] + :headers, + "content-type": "application/x-www-form-urlencoded" ) query |> Req.post!(opts) |> Map.get(:body) |> URI.decode_query() - |> check_authenticated + |> check_authenticated() end defp check_authenticated(%{"access_token" => access_token}) do - access_token - |> get_user_details + get_user_details(access_token) end defp check_authenticated(error), do: {:error, error} defp get_user_details(access_token) do opts = - Keyword.merge( + Keyword.put( Application.get_env(:codebattle, :auth_req_options, []), - headers: [ - "user-agent": "Codebattle", - authorization: "token #{access_token}" - ] + :headers, + "user-agent": "Codebattle", + authorization: "token #{access_token}" ) @github_user_url @@ -89,7 +88,8 @@ defmodule Codebattle.Auth.Github do end defp get_primary_email(access_token) do - Req.get!("https://api.github.com/user/emails", + "https://api.github.com/user/emails" + |> Req.get!( headers: [ "user-agent": "Codebattle", authorization: "token #{access_token}" @@ -106,7 +106,7 @@ defmodule Codebattle.Auth.Github do defp set_user_email(user, email, _access_token), do: Map.put(user, "email", email) - defp set_user_details(user = %{"login" => _name, "email" => email}, access_token) do + defp set_user_details(%{"login" => _name, "email" => email} = user, access_token) do user = user |> Map.put("access_token", access_token) diff --git a/services/app/apps/codebattle/lib/codebattle/auth/github_mock.ex b/services/app/apps/codebattle/lib/codebattle/auth/github_mock.ex index a8b326800..a55e2d122 100644 --- a/services/app/apps/codebattle/lib/codebattle/auth/github_mock.ex +++ b/services/app/apps/codebattle/lib/codebattle/auth/github_mock.ex @@ -45,37 +45,16 @@ defmodule Codebattle.Auth.GithubMock do def get!(url, headers \\ [], options \\ []) - def get!( - "https://api.github.com/user", - [ - {"User-Agent", "Codebattle"}, - {"Authorization", "token 123"} - ], - _options - ) do - %{body: "{\"error\": \"test error\"}"} + def get!("https://api.github.com/user", [{"User-Agent", "Codebattle"}, {"Authorization", "token 123"}], _options) do + %{body: ~s({"error": "test error"})} end - def get!( - "https://api.github.com/user", - [ - {"User-Agent", "Codebattle"}, - {"Authorization", "token 42"} - ], - _options - ) do + def get!("https://api.github.com/user", [{"User-Agent", "Codebattle"}, {"Authorization", "token 42"}], _options) do %{body: @body_email_nil} end # user emails - def get!( - "https://api.github.com/user/emails", - [ - {"User-Agent", "Codebattle"}, - {"Authorization", "token 42"} - ], - _options - ) do + def get!("https://api.github.com/user/emails", [{"User-Agent", "Codebattle"}, {"Authorization", "token 42"}], _options) do %{body: @emails} end diff --git a/services/app/apps/codebattle/lib/codebattle/auth/github_user.ex b/services/app/apps/codebattle/lib/codebattle/auth/github_user.ex index 70ebd9f40..5b1697345 100644 --- a/services/app/apps/codebattle/lib/codebattle/auth/github_user.ex +++ b/services/app/apps/codebattle/lib/codebattle/auth/github_user.ex @@ -72,7 +72,7 @@ defmodule Codebattle.Auth.User.GithubUser do end defp generate_unique_name(name) do - new_name = "#{name}_#{:crypto.strong_rand_bytes(2) |> Base.encode16()}" + new_name = "#{name}_#{2 |> :crypto.strong_rand_bytes() |> Base.encode16()}" case Repo.get_by(User, name: new_name) do %User{} -> diff --git a/services/app/apps/codebattle/lib/codebattle/auth/token_user.ex b/services/app/apps/codebattle/lib/codebattle/auth/token_user.ex index 495a36857..6ee0a70c7 100644 --- a/services/app/apps/codebattle/lib/codebattle/auth/token_user.ex +++ b/services/app/apps/codebattle/lib/codebattle/auth/token_user.ex @@ -2,11 +2,11 @@ defmodule Codebattle.Auth.User.TokenUser do @moduledoc """ Token auth """ - require Logger - alias Codebattle.Repo alias Codebattle.User + require Logger + def find(nil), do: {:error, "lol"} def find(""), do: {:error, "kek"} diff --git a/services/app/apps/codebattle/lib/codebattle/auth/user.ex b/services/app/apps/codebattle/lib/codebattle/auth/user.ex index 0530f1af1..dbddb3e84 100644 --- a/services/app/apps/codebattle/lib/codebattle/auth/user.ex +++ b/services/app/apps/codebattle/lib/codebattle/auth/user.ex @@ -3,6 +3,7 @@ defmodule Codebattle.Auth.User do dispatcher for Auth """ + alias Codebattle.Auth.User.FirebaseUser alias Codebattle.Repo alias Codebattle.User @@ -19,14 +20,14 @@ defmodule Codebattle.Auth.User do end def find_by_firebase(user_attrs) do - Codebattle.Auth.User.FirebaseUser.find(user_attrs) + FirebaseUser.find(user_attrs) end def create_in_firebase(user_attrs) do - Codebattle.Auth.User.FirebaseUser.create(user_attrs) + FirebaseUser.create(user_attrs) end def reset_in_firebase(user_attrs) do - Codebattle.Auth.User.FirebaseUser.reset(user_attrs) + FirebaseUser.reset(user_attrs) end end diff --git a/services/app/apps/codebattle/lib/codebattle/bot/chat_client.ex b/services/app/apps/codebattle/lib/codebattle/bot/chat_client.ex index 2f1560fd2..636159c4f 100644 --- a/services/app/apps/codebattle/lib/codebattle/bot/chat_client.ex +++ b/services/app/apps/codebattle/lib/codebattle/bot/chat_client.ex @@ -40,8 +40,8 @@ defmodule Codebattle.Bot.ChatClient do send_text(chat_channel, start_code_text(total_time_min)) end - defp excuse_text() do - [ + defp excuse_text do + Enum.random([ "You lucky. I don't have a clue, how solve it", "Perhaps, you can solve this better than I can", "Dame it!!!! It's hard task...", @@ -53,8 +53,7 @@ defmodule Codebattle.Bot.ChatClient do "RedBrother, HELP me, please!!!!", "I seem to remember how to solve this task in Clojure...", "Ruby or not to Ruby?..." - ] - |> Enum.random() + ]) end defp congratulate_opponent_text("training") do @@ -62,7 +61,7 @@ defmodule Codebattle.Bot.ChatClient do end defp congratulate_opponent_text(_) do - [ + Enum.random([ "GG WP", "Good job!", "Well played!", @@ -70,51 +69,45 @@ defmodule Codebattle.Bot.ChatClient do "I'll be back next time!", "I will return!!111", "I'll get my revenge next time!" - ] - |> Enum.random() + ]) end - defp advice_on_give_up_text() do - [ + defp advice_on_give_up_text do + Enum.random([ "Did the task seems complicated? Here, at hexlet.io we will teach you how to solve such tasks!", "Hey, there! Learn JS and be happy!", "Maybe you should pick Ruby for this task?", "You know that PHP has levenshtein distance calculation function?", "You know that Ruby has functions for calculating complex numbers?" - ] - |> Enum.random() + ]) end - defp advice_on_win() do - ["Nice shot!", "GG WP!", "Good job!", "Good one!", "Nice one!"] - |> Enum.random() + defp advice_on_win do + Enum.random(["Nice shot!", "GG WP!", "Good job!", "Good one!", "Nice one!"]) end - defp advice_on_check_complete_success() do - ["Nice try", "Wow", "Easy", "Ez"] - |> Enum.random() + defp advice_on_check_complete_success do + Enum.random(["Nice try", "Wow", "Easy", "Ez"]) end - defp advice_on_check_complete_failure() do - ["Oh snap", "Take it easy"] - |> Enum.random() + defp advice_on_check_complete_failure do + Enum.random(["Oh snap", "Take it easy"]) end - defp greet_opponent_text() do - [ + defp greet_opponent_text do + Enum.random([ "Hey, I'll join when you start writing code", "Hey there! I will wait... Until you start coding.", "I won't start writing code. Only after you :)" - ] - |> Enum.random() + ]) end defp start_code_text(total_time_min) do "I'll solve this task in about #{total_time_min} minutes. Good luck!" end - defp say_about_code() do - [ + defp say_about_code do + Enum.random([ "Your code looks very strange...", "I'll be nice, once, then I won't", "What did you just type? Looks strange...", @@ -122,8 +115,7 @@ defmodule Codebattle.Bot.ChatClient do "Hmmmm...", "Whaaaaat?...", "¯\_(ツ)_/¯" - ] - |> Enum.random() + ]) end # TODO: add this event diff --git a/services/app/apps/codebattle/lib/codebattle/bot/game_creator.ex b/services/app/apps/codebattle/lib/codebattle/bot/game_creator.ex index a853b6d7c..809be7167 100644 --- a/services/app/apps/codebattle/lib/codebattle/bot/game_creator.ex +++ b/services/app/apps/codebattle/lib/codebattle/bot/game_creator.ex @@ -1,10 +1,11 @@ defmodule Codebattle.Bot.GameCreator do - alias Codebattle.Game - alias Codebattle.Bot - + @moduledoc false use GenServer - @timeout :timer.seconds(3) + alias Codebattle.Bot + alias Codebattle.Game + + @timeout to_timeout(second: 3) @spec start_link([]) :: GenServer.on_start() def start_link(_) do diff --git a/services/app/apps/codebattle/lib/codebattle/bot/playbook_player.ex b/services/app/apps/codebattle/lib/codebattle/bot/playbook_player.ex index 24bfd09b9..5aa8b0b1c 100644 --- a/services/app/apps/codebattle/lib/codebattle/bot/playbook_player.ex +++ b/services/app/apps/codebattle/lib/codebattle/bot/playbook_player.ex @@ -3,13 +3,14 @@ defmodule Codebattle.Bot.PlaybookPlayer do Module for playing playbooks """ - require Logger - alias Codebattle.Bot + alias Codebattle.Bot.PlaybookPlayer.Params alias Codebattle.Game alias Codebattle.Playbook alias Delta.Op + require Logger + defmodule Params do @moduledoc false # Action is one the maps @@ -33,9 +34,7 @@ defmodule Codebattle.Bot.PlaybookPlayer do )a end - alias Bot.PlaybookPlayer.Params - - @min_bot_step_timeout Application.compile_env(:codebattle, Codebattle.Bot)[ + @min_bot_step_timeout Application.compile_env(:codebattle, Bot)[ :min_bot_step_timeout ] @@ -43,17 +42,17 @@ defmodule Codebattle.Bot.PlaybookPlayer do @junior_rating 1212 @pro_time_ms %{ - "elementary" => :timer.minutes(2), - "easy" => :timer.minutes(3), - "medium" => :timer.minutes(5), - "hard" => :timer.minutes(7) + "elementary" => to_timeout(minute: 2), + "easy" => to_timeout(minute: 3), + "medium" => to_timeout(minute: 5), + "hard" => to_timeout(minute: 7) } @junior_time_ms %{ - "elementary" => :timer.minutes(7), - "easy" => :timer.minutes(11), - "medium" => :timer.minutes(13), - "hard" => :timer.minutes(17) + "elementary" => to_timeout(minute: 7), + "easy" => to_timeout(minute: 11), + "medium" => to_timeout(minute: 13), + "hard" => to_timeout(minute: 17) } def init(%{game: game, bot_id: bot_id}) do @@ -83,7 +82,7 @@ defmodule Codebattle.Bot.PlaybookPlayer do end # init - def next_step(params = %Params{editor_state: nil}) do + def next_step(%Params{editor_state: nil} = params) do %{actions: [%{editor_text: editor_text, editor_lang: editor_lang} | rest_actions]} = params %{ @@ -91,15 +90,11 @@ defmodule Codebattle.Bot.PlaybookPlayer do | actions: rest_actions, step_command: :update_editor, editor_state: {[Op.insert(editor_text)], editor_lang}, - step_timeout_ms: :timer.seconds(1) + step_timeout_ms: to_timeout(second: 1) } end - def next_step( - params = %Params{ - actions: [action = %{type: "update_editor_data", diff: diff} | rest_actions] - } - ) do + def next_step(%Params{actions: [%{type: "update_editor_data", diff: diff} = action | rest_actions]} = params) do {operations, lang} = params.editor_state operations = Delta.compose(operations, stringify_keys(diff.delta)) @@ -114,7 +109,7 @@ defmodule Codebattle.Bot.PlaybookPlayer do } end - def next_step(params = %Params{actions: [action = %{type: "game_over"} | _rest]}) do + def next_step(%Params{actions: [%{type: "game_over"} = action | _rest]} = params) do {operations, lang} = params.editor_state %{ @@ -126,7 +121,7 @@ defmodule Codebattle.Bot.PlaybookPlayer do } end - def next_step(params = %Params{actions: []}) do + def next_step(%Params{actions: []} = params) do %{params | state: :finished} end @@ -150,7 +145,7 @@ defmodule Codebattle.Bot.PlaybookPlayer do |> max(diff.time * step_coefficient) |> Kernel.*(1.0) |> Float.round(3) - |> round + |> round() end # Calculates the total operating time of the bot diff --git a/services/app/apps/codebattle/lib/codebattle/bot/server.ex b/services/app/apps/codebattle/lib/codebattle/bot/server.ex index 385c76284..d926252a0 100644 --- a/services/app/apps/codebattle/lib/codebattle/bot/server.ex +++ b/services/app/apps/codebattle/lib/codebattle/bot/server.ex @@ -4,15 +4,15 @@ defmodule Codebattle.Bot.Server do """ use GenServer - require Logger - alias Codebattle.Bot alias Codebattle.Game + require Logger + @port Application.compile_env(:codebattle, :ws_port, 4000) @spec start_link(%{game: Game.t(), bot_id: integer()}) :: GenServer.on_start() - def start_link(params = %{game: game, bot_id: bot_id}) do + def start_link(%{game: game, bot_id: bot_id} = params) do GenServer.start_link(__MODULE__, params, name: server_name(game.id, bot_id)) end @@ -58,7 +58,7 @@ defmodule Codebattle.Bot.Server do params -> Logger.debug(""" Start bot playbook player for game_id: #{inspect(state.game.id)}, - with playbook_params: #{inspect(Map.drop(params, [:actions]))} + with playbook_params: #{inspect(Map.delete(params, :actions))} """) {:noreply, state} @@ -93,10 +93,7 @@ defmodule Codebattle.Bot.Server do end @impl GenServer - def handle_info( - %{event: "user:check_complete", payload: %{"check_result" => %{"status" => "ok"}}}, - state - ) do + def handle_info(%{event: "user:check_complete", payload: %{"check_result" => %{"status" => "ok"}}}, state) do send_chat_message(state, :advice_on_check_complete_success) {:noreply, state} @@ -114,7 +111,7 @@ defmodule Codebattle.Bot.Server do @impl GenServer def handle_info(:say_about_code, state) do send_message_about_code(state) - Process.send_after(self(), :say_about_code, :timer.minutes(Enum.random(7..10))) + Process.send_after(self(), :say_about_code, to_timeout(minute: Enum.random(7..10))) {:noreply, state} end @@ -143,7 +140,7 @@ defmodule Codebattle.Bot.Server do {:noreply, state} end - defp do_playbook_step(state = %{state: :finished}), do: {:noreply, state} + defp do_playbook_step(%{state: :finished} = state), do: {:noreply, state} defp do_playbook_step(state) do playbook_params = Bot.PlaybookPlayer.next_step(state.playbook_params) @@ -206,7 +203,7 @@ defmodule Codebattle.Bot.Server do defp send_game_message(game_channel, :check_result, editor_params), do: Bot.GameClient.send(game_channel, :check_result, editor_params) - defp send_init_chat_message(state = %{playbook_params: nil}) do + defp send_init_chat_message(%{playbook_params: nil} = state) do send_chat_message(state, :excuse) end @@ -257,7 +254,7 @@ defmodule Codebattle.Bot.Server do end end - defp prepare_to_commenting_code() do - Process.send_after(self(), :say_about_code, :timer.minutes(1)) + defp prepare_to_commenting_code do + Process.send_after(self(), :say_about_code, to_timeout(minute: 1)) end end diff --git a/services/app/apps/codebattle/lib/codebattle/bot/supervisor.ex b/services/app/apps/codebattle/lib/codebattle/bot/supervisor.ex index 74b7324e8..431c63585 100644 --- a/services/app/apps/codebattle/lib/codebattle/bot/supervisor.ex +++ b/services/app/apps/codebattle/lib/codebattle/bot/supervisor.ex @@ -15,6 +15,5 @@ defmodule Codebattle.Bot.Supervisor do Supervisor.init([], strategy: :one_for_one) end - defp supervisor_name(game_id), - do: {:via, Registry, {Codebattle.Registry, "bot_sup:#{game_id}"}} + defp supervisor_name(game_id), do: {:via, Registry, {Codebattle.Registry, "bot_sup:#{game_id}"}} end diff --git a/services/app/apps/codebattle/lib/codebattle/chat/chat.ex b/services/app/apps/codebattle/lib/codebattle/chat/chat.ex index 48aae6891..cc38c98b3 100644 --- a/services/app/apps/codebattle/lib/codebattle/chat/chat.ex +++ b/services/app/apps/codebattle/lib/codebattle/chat/chat.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Chat do + @moduledoc false alias Codebattle.Chat alias Codebattle.User diff --git a/services/app/apps/codebattle/lib/codebattle/chat/message.ex b/services/app/apps/codebattle/lib/codebattle/chat/message.ex index fe138f89c..9c547b0ba 100644 --- a/services/app/apps/codebattle/lib/codebattle/chat/message.ex +++ b/services/app/apps/codebattle/lib/codebattle/chat/message.ex @@ -1,5 +1,7 @@ defmodule Codebattle.Chat.Message do + @moduledoc false use TypedStruct + @derive Jason.Encoder @type type() :: :text | :info diff --git a/services/app/apps/codebattle/lib/codebattle/chat/server.ex b/services/app/apps/codebattle/lib/codebattle/chat/server.ex index 18f89391f..950f4a137 100644 --- a/services/app/apps/codebattle/lib/codebattle/chat/server.ex +++ b/services/app/apps/codebattle/lib/codebattle/chat/server.ex @@ -1,13 +1,14 @@ defmodule Codebattle.Chat.Server do + @moduledoc false use GenServer - require Logger - alias Codebattle.Chat alias Codebattle.User - @default_message_ttl :timer.hours(1) - @default_clean_timeout :timer.minutes(1) + require Logger + + @default_message_ttl to_timeout(hour: 1) + @default_clean_timeout to_timeout(minute: 1) @initial_state %{ message_ttl: @default_message_ttl, clean_timeout: @default_clean_timeout, @@ -107,8 +108,7 @@ defmodule Codebattle.Chat.Server do def handle_call({:join, user}, _from, state) do new_users = [user | state.users] - {:reply, %{users: new_users, messages: Enum.reverse(state.messages)}, - %{state | users: new_users}} + {:reply, %{users: new_users, messages: Enum.reverse(state.messages)}, %{state | users: new_users}} end @impl GenServer @@ -169,7 +169,7 @@ defmodule Codebattle.Chat.Server do end @impl GenServer - def handle_info(:clean_messages, state = %{messages: messages}) do + def handle_info(:clean_messages, %{messages: messages} = state) do new_messages = Enum.reject( messages, diff --git a/services/app/apps/codebattle/lib/codebattle/cheat_check.ex b/services/app/apps/codebattle/lib/codebattle/cheat_check.ex index 566c4b8b5..98fd96bdb 100644 --- a/services/app/apps/codebattle/lib/codebattle/cheat_check.ex +++ b/services/app/apps/codebattle/lib/codebattle/cheat_check.ex @@ -1,19 +1,14 @@ defmodule Codebattle.CheatCheck do - require Logger + @moduledoc false alias Codebattle.Playbook + require Logger + def call(%Playbook{solution_type: "incomplete"}, _solution) do {:error, "incomplete solution"} end - def call( - %Playbook{ - winner_id: winner_id, - winner_lang: winner_lang, - data: data - }, - _solution - ) do + def call(%Playbook{winner_id: winner_id, winner_lang: winner_lang, data: data}, _solution) do start_checking() |> copy_paste_check(%{ player_id: winner_id, @@ -23,34 +18,23 @@ defmodule Codebattle.CheatCheck do |> end_checking() end - defp start_checking(), - do: %{ - status: "success", - start_time: :os.system_time(:millisecond) - } + defp start_checking, do: %{status: "success", start_time: :os.system_time(:millisecond)} defp end_checking(%{status: "success"}), do: :ok defp end_checking(%{status: status}), do: {:failure, status} - defp copy_paste_check(result, %{ - player_id: id, - player_lang: lang, - records: records - }) - when result.status == "success" do + defp copy_paste_check(result, %{player_id: id, player_lang: lang, records: records}) when result.status == "success" do t = :os.system_time(:millisecond) editor_updates = Enum.filter(records, &editor_update?(&1, id, lang)) check_result = Enum.count(editor_updates) > 5 checking_time = :os.system_time(:millisecond) - t - Logger.debug( - "Finish checking solution on copy/paste, result: #{check_result}, time: #{checking_time}" - ) + Logger.debug("Finish checking solution on copy/paste, result: #{check_result}, time: #{checking_time}") if check_result do result else - result |> Map.put(:status, "copy/paste") + Map.put(result, :status, "copy/paste") end end diff --git a/services/app/apps/codebattle/lib/codebattle/clan.ex b/services/app/apps/codebattle/lib/codebattle/clan.ex index 6d64e2665..681373839 100644 --- a/services/app/apps/codebattle/lib/codebattle/clan.ex +++ b/services/app/apps/codebattle/lib/codebattle/clan.ex @@ -24,7 +24,7 @@ defmodule Codebattle.Clan do end @spec get_all() :: list(t()) - def get_all() do + def get_all do Repo.all(__MODULE__) end diff --git a/services/app/apps/codebattle/lib/codebattle/clan/scope.ex b/services/app/apps/codebattle/lib/codebattle/clan/scope.ex index 9523feb1a..09b95d37d 100644 --- a/services/app/apps/codebattle/lib/codebattle/clan/scope.ex +++ b/services/app/apps/codebattle/lib/codebattle/clan/scope.ex @@ -3,10 +3,10 @@ defmodule Codebattle.Clan.Scope do Module with scopes for the Clan scheme """ - alias Codebattle.Clan - import Ecto.Query + alias Codebattle.Clan + def by_clan do Clan |> from(as: :c) diff --git a/services/app/apps/codebattle/lib/codebattle/code_check.ex b/services/app/apps/codebattle/lib/codebattle/code_check.ex index b2b567c05..4196256b6 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check.ex @@ -1,4 +1,5 @@ defmodule Codebattle.CodeCheck do + @moduledoc false alias Codebattle.CodeCheck.Checker alias Codebattle.CodeCheck.Result alias Runner.LanguageMeta diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/assert_result.ex b/services/app/apps/codebattle/lib/codebattle/code_check/assert_result.ex index 09a6ac0ef..7c778ee1f 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/assert_result.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/assert_result.ex @@ -1,6 +1,4 @@ defmodule Codebattle.CodeCheck.Result.V2.AssertResult do - use TypedStruct - @moduledoc """ statuses: failure -> wrong assert check @@ -8,6 +6,8 @@ defmodule Codebattle.CodeCheck.Result.V2.AssertResult do error -> caught error from solution() """ + use TypedStruct + @derive Jason.Encoder typedstruct do diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/checker.ex b/services/app/apps/codebattle/lib/codebattle/code_check/checker.ex index c2a85b395..c14545dfe 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/checker.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/checker.ex @@ -1,4 +1,5 @@ defmodule Codebattle.CodeCheck.Checker do + @moduledoc false alias Codebattle.CodeCheck alias Codebattle.CodeCheck.Checker.Token alias Codebattle.CodeCheck.OutputParser diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/executor/fake.ex b/services/app/apps/codebattle/lib/codebattle/code_check/executor/fake.ex index 355940850..aa1b6d2d6 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/executor/fake.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/executor/fake.ex @@ -20,12 +20,12 @@ defmodule Codebattle.CodeCheck.Executor.Fake do """ @spec call(Token.t()) :: Token.t() - def call(token = %{solution_text: "solve_percent_33"}) do + def call(%{solution_text: "solve_percent_33"} = token) do %{token | container_stderr: "", container_output: @fake_output_33, exit_code: 0} end @spec call(Token.t()) :: Token.t() - def call(token = %{solution_text: "solve_percent_66"}) do + def call(%{solution_text: "solve_percent_66"} = token) do %{token | container_stderr: "", container_output: @fake_output_66, exit_code: 0} end diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/executor/remote_docker_run.ex b/services/app/apps/codebattle/lib/codebattle/code_check/executor/remote_docker_run.ex index e595489bb..d82fa5be1 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/executor/remote_docker_run.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/executor/remote_docker_run.ex @@ -1,12 +1,12 @@ defmodule Codebattle.CodeCheck.Executor.RemoteDockerRun do @moduledoc false - require Logger - alias Codebattle.CodeCheck.Checker.Token alias Runner.AtomizedMap alias Runner.Languages + require Logger + @spec call(Token.t()) :: Token.t() def call(token) do %{ @@ -44,9 +44,7 @@ defmodule Codebattle.CodeCheck.Executor.RemoteDockerRun do |> Finch.request(CodebattleHTTP, receive_timeout: Languages.get_timeout_ms(lang_meta)) |> case do {:ok, %Finch.Response{status: 200, body: body}} -> - Logger.error( - "RemoteExecutor success lang: #{lang_meta.slug}, time_ms: #{:os.system_time(:millisecond) - now}}" - ) + Logger.error("RemoteExecutor success lang: #{lang_meta.slug}, time_ms: #{:os.system_time(:millisecond) - now}}") AtomizedMap.load(body) diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/executor/remote_rust.ex b/services/app/apps/codebattle/lib/codebattle/code_check/executor/remote_rust.ex index 73c2d22fb..103b14645 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/executor/remote_rust.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/executor/remote_rust.ex @@ -1,12 +1,12 @@ defmodule Codebattle.CodeCheck.Executor.RemoteRust do @moduledoc false - require Logger - alias Codebattle.CodeCheck.Checker.Token alias Runner.AtomizedMap - alias Runner.Languages alias Runner.CheckerGenerator + alias Runner.Languages + + require Logger @spec call(Token.t()) :: Token.t() def call(token) do @@ -15,8 +15,6 @@ defmodule Codebattle.CodeCheck.Executor.RemoteRust do checker_text = if token.lang_meta.generate_checker? do CheckerGenerator.call(token.task, token.lang_meta, seed) - else - nil end asserts = diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/output_parser.ex b/services/app/apps/codebattle/lib/codebattle/code_check/output_parser.ex index ebf4db478..bbc899c5a 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/output_parser.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/output_parser.ex @@ -1,10 +1,11 @@ defmodule Codebattle.CodeCheck.OutputParser do @moduledoc "Parse container output for representing check status of solution" - require Logger alias Codebattle.CodeCheck.Result - def call(token = %{lang_meta: %{output_version: 2}}) do + require Logger + + def call(%{lang_meta: %{output_version: 2}} = token) do Codebattle.CodeCheck.OutputParser.V2.call(token) end diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/output_parser_v2.ex b/services/app/apps/codebattle/lib/codebattle/code_check/output_parser_v2.ex index 4c42fd0c9..35bb7f2ee 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/output_parser_v2.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/output_parser_v2.ex @@ -1,8 +1,8 @@ defmodule Codebattle.CodeCheck.OutputParser.V2 do @moduledoc "Parse container output for representing check status of solution" - alias Runner.AtomizedMap alias Codebattle.CodeCheck.Result + alias Runner.AtomizedMap def call(%{execution_error: :timeout}) do %Result.V2{status: "service_timeout"} @@ -32,7 +32,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2 do |> Map.get(:check_result) end - defp parse_output(token = %{exit_code: 0}) do + defp parse_output(%{exit_code: 0} = token) do solution_results = token.container_output |> String.replace(~r/WARNING:.+\n/, "") @@ -106,13 +106,10 @@ defmodule Codebattle.CodeCheck.OutputParser.V2 do } end - defp compare_results_with_asserts(token = %{check_result: %{status: "error"}}), do: token + defp compare_results_with_asserts(%{check_result: %{status: "error"}} = token), do: token defp compare_results_with_asserts( - token = %{ - solution_results: item = %{"type" => "error"}, - container_stderr: container_stderr - } + %{solution_results: %{"type" => "error"} = item, container_stderr: container_stderr} = token ) do # {"time":0,"type":"error","value":"undefined function sdf/0 (there is no such import)"} check_result = %Result.V2{ @@ -127,10 +124,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2 do end defp compare_results_with_asserts( - token = %{ - solution_results: [item = %{"type" => "error"}], - container_stderr: container_stderr - } + %{solution_results: [%{"type" => "error"} = item], container_stderr: container_stderr} = token ) do # {"time":0,"type":"error","value":"undefined function sdf/0 (there is no such import)"} check_result = %Result.V2{ @@ -182,7 +176,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2 do %{token | check_result: check_result} end - defp calculate_result_metrics(token = %{check_result: %{status: "error"}}), do: token + defp calculate_result_metrics(%{check_result: %{status: "error"}} = token), do: token defp calculate_result_metrics(token) do success_asserts = Enum.filter(token.check_result.asserts, fn x -> x.status == "success" end) @@ -198,7 +192,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2 do %{ token - | check_result: %Result.V2{ + | check_result: %{ token.check_result | asserts: failure_asserts ++ success_asserts, success_count: success_count, diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/result.ex b/services/app/apps/codebattle/lib/codebattle/code_check/result.ex index 98175e331..e0ea51e4c 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/result.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/result.ex @@ -4,6 +4,7 @@ defmodule Codebattle.CodeCheck.Result do # statuses: "initial", "ok", "failure", "error", "service_timeout", "service_failure" use TypedStruct + @derive Jason.Encoder typedstruct do diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/result_v2.ex b/services/app/apps/codebattle/lib/codebattle/code_check/result_v2.ex index 6f5f501a3..00e268561 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/result_v2.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/result_v2.ex @@ -1,8 +1,4 @@ defmodule Codebattle.CodeCheck.Result.V2 do - use TypedStruct - - alias Codebattle.CodeCheck.Result.V2.AssertResult - @moduledoc """ statuses: initial -> no check runs @@ -14,6 +10,10 @@ defmodule Codebattle.CodeCheck.Result.V2 do service_failure -> remote execution failure """ + use TypedStruct + + alias Codebattle.CodeCheck.Result.V2.AssertResult + @derive Jason.Encoder typedstruct do diff --git a/services/app/apps/codebattle/lib/codebattle/code_check/token.ex b/services/app/apps/codebattle/lib/codebattle/code_check/token.ex index 2dd9a5e6f..62b6a8d9a 100644 --- a/services/app/apps/codebattle/lib/codebattle/code_check/token.ex +++ b/services/app/apps/codebattle/lib/codebattle/code_check/token.ex @@ -1,4 +1,5 @@ defmodule Codebattle.CodeCheck.Checker.Token do + @moduledoc false use TypedStruct alias Codebattle.CodeCheck diff --git a/services/app/apps/codebattle/lib/codebattle/customization.ex b/services/app/apps/codebattle/lib/codebattle/customization.ex index 7155c0453..5b3118fee 100644 --- a/services/app/apps/codebattle/lib/codebattle/customization.ex +++ b/services/app/apps/codebattle/lib/codebattle/customization.ex @@ -1,5 +1,7 @@ defmodule Codebattle.Customization do + @moduledoc false use Ecto.Schema + import Ecto.Changeset alias Codebattle.Repo diff --git a/services/app/apps/codebattle/lib/codebattle/event/event_clan_result.ex b/services/app/apps/codebattle/lib/codebattle/event/event_clan_result.ex index ef1e4bda9..3dc681097 100644 --- a/services/app/apps/codebattle/lib/codebattle/event/event_clan_result.ex +++ b/services/app/apps/codebattle/lib/codebattle/event/event_clan_result.ex @@ -1,13 +1,14 @@ defmodule Codebattle.Event.EventClanResult do @moduledoc false + use Ecto.Schema + + import Ecto.Query + alias Codebattle.Clan alias Codebattle.Event alias Codebattle.Repo - use Ecto.Schema - import Ecto.Query - @type t :: %__MODULE__{} @derive {Jason.Encoder, only: [:clan_id, :players_count, :place, :score]} diff --git a/services/app/apps/codebattle/lib/codebattle/event/event_result.ex b/services/app/apps/codebattle/lib/codebattle/event/event_result.ex index bca4d7cef..679276745 100644 --- a/services/app/apps/codebattle/lib/codebattle/event/event_result.ex +++ b/services/app/apps/codebattle/lib/codebattle/event/event_result.ex @@ -1,14 +1,15 @@ defmodule Codebattle.Event.EventResult do @moduledoc false + use Ecto.Schema + + import Ecto.Query + alias Codebattle.Clan alias Codebattle.Event alias Codebattle.Repo alias Codebattle.User - use Ecto.Schema - import Ecto.Query - @type t :: %__MODULE__{} @derive Jason.Encoder diff --git a/services/app/apps/codebattle/lib/codebattle/feedback.ex b/services/app/apps/codebattle/lib/codebattle/feedback.ex index 3a96cf658..5ff5c91ec 100644 --- a/services/app/apps/codebattle/lib/codebattle/feedback.ex +++ b/services/app/apps/codebattle/lib/codebattle/feedback.ex @@ -4,11 +4,12 @@ defmodule Codebattle.Feedback do """ use Ecto.Schema + import Ecto.Changeset import Ecto.Query - alias Codebattle.Repo alias Codebattle.Feedback + alias Codebattle.Repo @derive {Jason.Encoder, only: [:id, :author_name, :status, :text, :title_link, :inserted_at]} @@ -22,13 +23,13 @@ defmodule Codebattle.Feedback do end @doc false - def changeset(feedback = %Feedback{}, attrs) do + def changeset(%Feedback{} = feedback, attrs) do feedback |> cast(attrs, [:author_name, :status, :text, :title_link]) |> validate_required([:author_name, :status, :text, :title_link]) end - def get_all() do + def get_all do from( f in Feedback, order_by: [desc: f.inserted_at] diff --git a/services/app/apps/codebattle/lib/codebattle/forms/task.ex b/services/app/apps/codebattle/lib/codebattle/forms/task.ex index e211ca616..a3ee89254 100644 --- a/services/app/apps/codebattle/lib/codebattle/forms/task.ex +++ b/services/app/apps/codebattle/lib/codebattle/forms/task.ex @@ -3,26 +3,18 @@ defmodule Codebattle.TaskForm do import Ecto.Changeset - alias Codebattle.Repo - alias Codebattle.Task alias Codebattle.AssertsService alias Codebattle.AssertsService.Result + alias Codebattle.Repo + alias Codebattle.Task def create(params, user, %{"next_state" => next_state}) do - new_params = - params - |> Map.merge(%{ - "origin" => "user", - "state" => next_state, - "creator_id" => user.id - }) + new_params = Map.merge(params, %{"origin" => "user", "state" => next_state, "creator_id" => user.id}) - changeset = - %Task{} - |> changeset(new_params) + changeset = changeset(%Task{}, new_params) if next_state == "draft" do - changeset |> Repo.insert() + Repo.insert(changeset) else {:ok, changeset.changes} end diff --git a/services/app/apps/codebattle/lib/codebattle/forms/task_pack.ex b/services/app/apps/codebattle/lib/codebattle/forms/task_pack.ex index 8b4d4abd9..19bc26eef 100644 --- a/services/app/apps/codebattle/lib/codebattle/forms/task_pack.ex +++ b/services/app/apps/codebattle/lib/codebattle/forms/task_pack.ex @@ -7,12 +7,7 @@ defmodule Codebattle.TaskPackForm do alias Codebattle.TaskPack def create(params, user) do - new_params = - params - |> Map.merge(%{ - "state" => "draft", - "creator_id" => user.id - }) + new_params = Map.merge(params, %{"state" => "draft", "creator_id" => user.id}) %TaskPack{} |> changeset(new_params) diff --git a/services/app/apps/codebattle/lib/codebattle/game.ex b/services/app/apps/codebattle/lib/codebattle/game.ex index 5290b83b0..45bdc8e6a 100644 --- a/services/app/apps/codebattle/lib/codebattle/game.ex +++ b/services/app/apps/codebattle/lib/codebattle/game.ex @@ -2,6 +2,7 @@ defmodule Codebattle.Game do @moduledoc false use Ecto.Schema + import Ecto.Changeset alias Codebattle.Game @@ -31,7 +32,7 @@ defmodule Codebattle.Game do :waiting_room_name ]} - @default_timeout_seconds div(:timer.minutes(30), 1000) + @default_timeout_seconds div(to_timeout(minute: 30), 1000) @states ~w(initial builder waiting_opponent playing game_over timeout canceled) @rematch_states ~w(none in_approval rejected accepted) @@ -75,7 +76,7 @@ defmodule Codebattle.Game do end @doc false - def changeset(game = %Game{}, attrs) do + def changeset(%Game{} = game, attrs) do game |> cast(attrs, [ :award, diff --git a/services/app/apps/codebattle/lib/codebattle/game/auth.ex b/services/app/apps/codebattle/lib/codebattle/game/auth.ex index 78d67e593..1b254b485 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/auth.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/auth.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Game.Auth do + @moduledoc false alias Codebattle.Game def player_can_play_game?(players) when is_list(players) do @@ -15,14 +16,14 @@ defmodule Codebattle.Game.Auth do def player_can_play_game?(player) do is_player = - Game.Context.get_active_games() - |> Enum.any?(fn game -> + Enum.any?(Game.Context.get_active_games(), fn game -> Game.Helpers.player?(game, player.id) end) - case is_player do - false -> :ok - true -> {:error, :already_in_a_game} + if is_player do + {:error, :already_in_a_game} + else + :ok end end @@ -35,9 +36,10 @@ defmodule Codebattle.Game.Auth do end def player_can_rematch?(game, player_id) do - case Game.Helpers.player?(game, player_id) do - true -> :ok - false -> {:error, :not_authorized} + if Game.Helpers.player?(game, player_id) do + :ok + else + {:error, :not_authorized} end end end diff --git a/services/app/apps/codebattle/lib/codebattle/game/context.ex b/services/app/apps/codebattle/lib/codebattle/game/context.ex index 5c06b158a..3110c4964 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/context.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/context.ex @@ -4,21 +4,21 @@ defmodule Codebattle.Game.Context do Public interface to interacting with games. """ - require Logger - import Codebattle.Game.Auth import Codebattle.Game.Helpers import Ecto.Query + alias Codebattle.Bot alias Codebattle.CodeCheck alias Codebattle.Game alias Codebattle.Game.Engine alias Codebattle.Game.Player - alias Codebattle.Bot alias Codebattle.Repo alias Codebattle.Tournament alias Codebattle.User + require Logger + @type raw_game_id :: String.t() | non_neg_integer() @type game_id :: non_neg_integer() @type tournament_id :: non_neg_integer() @@ -110,9 +110,7 @@ defmodule Codebattle.Game.Context do |> User.get!() |> Player.build() - opponent_bot = - Bot.Context.build() - |> Player.build() + opponent_bot = Player.build(Bot.Context.build()) players = [ current_player, @@ -162,7 +160,7 @@ defmodule Codebattle.Game.Context do {:ok, Game.t()} | {:error, atom} def update_editor_data(game_id, user, editor_text, editor_lang) do case get_game!(game_id) do - game = %{is_live: true} -> + %{is_live: true} = game -> Engine.update_editor_data(game, %{ id: user.id, editor_text: editor_text, @@ -183,7 +181,7 @@ defmodule Codebattle.Game.Context do | {:error, atom} def check_result(id, params) do case get_game!(id) do - game = %{is_live: true} -> Engine.check_result(game, params) + %{is_live: true} = game -> Engine.check_result(game, params) _ -> {:error, :game_is_dead} end end @@ -191,7 +189,7 @@ defmodule Codebattle.Game.Context do @spec give_up(game_id, User.t()) :: {:ok, Game.t()} | {:error, atom} def give_up(id, user) do case get_game!(id) do - game = %{is_live: true} -> Engine.give_up(game, user) + %{is_live: true} = game -> Engine.give_up(game, user) _ -> {:error, :game_is_dead} end end @@ -201,7 +199,7 @@ defmodule Codebattle.Game.Context do | {:rematch_accepted, Game.t()} | {:error, atom} def rematch_send_offer(game_id, user) do - with game = %{is_live: true} <- get_game!(game_id), + with %{is_live: true} = game <- get_game!(game_id), :ok <- player_can_rematch?(game, user.id) do Engine.rematch_send_offer(game, user) end @@ -210,7 +208,7 @@ defmodule Codebattle.Game.Context do @spec rematch_reject(game_id) :: {:rematch_status_updated, map()} | {:error, atom} def rematch_reject(game_id) do case get_game!(game_id) do - game = %{is_live: true} -> Engine.rematch_reject(game) + %{is_live: true} = game -> Engine.rematch_reject(game) _ -> {:error, :game_is_dead} end end @@ -218,7 +216,7 @@ defmodule Codebattle.Game.Context do @spec unlock_game(game_id, String.t()) :: :ok | {:error, term()} def unlock_game(game_id, pass_code) do case get_game!(game_id) do - game = %{tournament_id: t_id} when not is_nil(t_id) -> + %{tournament_id: t_id} = game when not is_nil(t_id) -> if Tournament.Context.check_pass_code(t_id, pass_code) do Tournament.Context.remove_pass_code(t_id, pass_code) Engine.unlock_game(game) @@ -238,11 +236,11 @@ defmodule Codebattle.Game.Context do end @spec terminate_game(game_id | Game.t()) :: :ok - def terminate_game(game = %Game{}) do + def terminate_game(%Game{} = game) do Engine.terminate_game(game) end - def terminate_game(id), do: get_game!(id) |> terminate_game() + def terminate_game(id), do: id |> get_game!() |> terminate_game() @spec get_active_game_id(integer() | String.t()) :: nil | integer() def get_active_game_id(nil), do: nil diff --git a/services/app/apps/codebattle/lib/codebattle/game/elo.ex b/services/app/apps/codebattle/lib/codebattle/game/elo.ex index 2f16dded2..21bfee595 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/elo.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/elo.ex @@ -28,9 +28,7 @@ defmodule Codebattle.Game.Elo do defp transform_rating(rating), do: :math.pow(10, rating / 400) - defp winner_expected(r1, r2), - do: 1 - transform_rating(r1) / (transform_rating(r1) + transform_rating(r2)) + defp winner_expected(r1, r2), do: 1 - transform_rating(r1) / (transform_rating(r1) + transform_rating(r2)) - defp loser_expected(r1, r2), - do: 0 - transform_rating(r2) / (transform_rating(r1) + transform_rating(r2)) + defp loser_expected(r1, r2), do: 0 - transform_rating(r2) / (transform_rating(r1) + transform_rating(r2)) end diff --git a/services/app/apps/codebattle/lib/codebattle/game/engine.ex b/services/app/apps/codebattle/lib/codebattle/game/engine.ex index 7fca7e093..006c47ffd 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/engine.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/engine.ex @@ -1,6 +1,5 @@ defmodule Codebattle.Game.Engine do - require Logger - + @moduledoc false import Codebattle.Game.Auth import Codebattle.Game.Helpers @@ -12,8 +11,10 @@ defmodule Codebattle.Game.Engine do alias Codebattle.User alias Codebattle.UserGame - @default_timeout div(:timer.minutes(30), 1000) - @max_timeout div(:timer.hours(1), 1000) + require Logger + + @default_timeout div(to_timeout(minute: 30), 1000) + @max_timeout div(to_timeout(hour: 1), 1000) def create_game(params) do # TODO: add support for tags @@ -64,9 +65,6 @@ defmodule Codebattle.Game.Engine do :ok <- maybe_fire_playing_game_side_effects(game), :ok <- broadcast_game_created(game) do {:ok, game} - else - {:error, reason} -> - {:error, reason} end end @@ -143,9 +141,6 @@ defmodule Codebattle.Game.Engine do :ok <- maybe_fire_playing_game_side_effects(game), :ok <- broadcast_game_updated(game) do {:ok, game} - else - {:error, reason} -> - {:error, reason} end end @@ -240,30 +235,26 @@ defmodule Codebattle.Game.Engine do :ok <- terminate_game(game) do update_game!(game, %{state: "canceled"}) :ok - else - {:error, reason} -> {:error, reason} end end - def terminate_game(game = %Game{}) do - case game.is_live do - true -> - Game.GlobalSupervisor.terminate_game(game.id) - - if game.tournament_id do - :noop - else - Codebattle.PubSub.broadcast("game:terminated", %{game: game}) - end + def terminate_game(%Game{} = game) do + if game.is_live do + Game.GlobalSupervisor.terminate_game(game.id) - :ok + if game.tournament_id do + :noop + else + Codebattle.PubSub.broadcast("game:terminated", %{game: game}) + end - _ -> - :ok + :ok + else + :ok end end - def rematch_send_offer(game = %{is_bot: true}, _user) do + def rematch_send_offer(%{is_bot: true} = game, _user) do {:ok, new_game} = create_rematch_game(game) Game.GlobalSupervisor.terminate_game(game.id) @@ -354,7 +345,7 @@ defmodule Codebattle.Game.Engine do |> Repo.update!() end - def update_game!(game = %Game{}) do + def update_game!(%Game{} = game) do case Repo.get(Game, game.id) do nil -> :ok @@ -366,7 +357,7 @@ defmodule Codebattle.Game.Engine do end end - def update_game!(game = %Game{}, params) do + def update_game!(%Game{} = game, params) do case Repo.get(Game, game.id) do nil -> :ok @@ -382,11 +373,11 @@ defmodule Codebattle.Game.Engine do %UserGame{} |> UserGame.changeset(params) |> Repo.insert!() end - def trigger_timeout(game = %Game{state: "game_over"}) do + def trigger_timeout(%Game{state: "game_over"} = game) do terminate_game_after(game, 1) end - def trigger_timeout(game = %Game{}) do + def trigger_timeout(%Game{} = game) do Logger.debug("Trigger timeout for game: #{game.id}") {:ok, {old_game_state, new_game}} = fire_transition(game.id, :timeout, %{}) @@ -417,7 +408,7 @@ defmodule Codebattle.Game.Engine do :ok end - defp maybe_fire_playing_game_side_effects(game = %{state: "playing"}) do + defp maybe_fire_playing_game_side_effects(%{state: "playing"} = game) do init_playbook(game) run_bots(game) start_timeout_timer(game) diff --git a/services/app/apps/codebattle/lib/codebattle/game/fake_tasks_queues_server.ex b/services/app/apps/codebattle/lib/codebattle/game/fake_tasks_queues_server.ex index 038b456be..6556a8d25 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/fake_tasks_queues_server.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/fake_tasks_queues_server.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Game.FakeTasksQueuesServer do + @moduledoc false alias Codebattle.Repo def get_task(level) do diff --git a/services/app/apps/codebattle/lib/codebattle/game/fsm.ex b/services/app/apps/codebattle/lib/codebattle/game/fsm.ex index 7e3856018..e1b33e8c6 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/fsm.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/fsm.ex @@ -2,11 +2,12 @@ defmodule Codebattle.Game.Fsm do @moduledoc """ Finite state machine for game """ - require Logger import Codebattle.Game.Helpers alias Codebattle.Game + require Logger + @type event :: :join | :update_editor_data @@ -18,7 +19,7 @@ defmodule Codebattle.Game.Fsm do | :rematch_send_offer @spec transition(event, Game.t(), map()) :: {:ok, Game.t()} | {:error, String.t()} - def transition(:join, game = %{state: "waiting_opponent"}, params) do + def transition(:join, %{state: "waiting_opponent"} = game, params) do game = game |> Map.put(:state, "playing") @@ -31,14 +32,13 @@ defmodule Codebattle.Game.Fsm do {:error, "Can't join to a game in state: '#{game.state}'"} end - def transition(:update_editor_data, game = %{state: s}, params) - when s in ["playing", "game_over", "timeout"] do + def transition(:update_editor_data, %{state: s} = game, params) when s in ["playing", "game_over", "timeout"] do params_to_update = Map.take(params, [:editor_text, :editor_lang]) game = update_player(game, params.id, params_to_update) {:ok, game} end - def transition(:check_success, game = %{state: "playing"}, params) do + def transition(:check_success, %{state: "playing"} = game, params) do game = game |> update_check_result(params) @@ -50,27 +50,26 @@ defmodule Codebattle.Game.Fsm do {:ok, game} end - def transition(:check_success, game = %{state: "game_over"}, params) do + def transition(:check_success, %{state: "game_over"} = game, params) do {:ok, update_check_result(game, params)} end - def transition(:check_success, game = %{state: "timeout"}, _params) do + def transition(:check_success, %{state: "timeout"} = game, _params) do {:ok, game} end - def transition(:check_failure, game = %{state: s}, params) when s in ["playing", "game_over"] do + def transition(:check_failure, %{state: s} = game, params) when s in ["playing", "game_over"] do {:ok, update_check_result(game, params)} end - def transition(:check_failure, game = %{state: "timeout"}, _params) do + def transition(:check_failure, %{state: "timeout"} = game, _params) do {:ok, game} end - def transition(:give_up, game = %{state: "playing", tournament_id: t_id}, _params) - when not is_nil(t_id), - do: {:ok, game} + def transition(:give_up, %{state: "playing", tournament_id: t_id} = game, _params) when not is_nil(t_id), + do: {:ok, game} - def transition(:give_up, game = %{state: "playing"}, params) do + def transition(:give_up, %{state: "playing"} = game, params) do game = game |> update_player(params.id, %{result: "gave_up"}) @@ -85,8 +84,7 @@ defmodule Codebattle.Game.Fsm do {:error, "Can't give_up in a game in state: '#{game.state}'"} end - def transition(:timeout, game = %{state: s, players: players}, _params) - when s in ["waiting_opponent", "playing"] do + def transition(:timeout, %{state: s, players: players} = game, _params) when s in ["waiting_opponent", "playing"] do new_players = Enum.map(players, fn player -> %{player | result: "timeout"} end) game = @@ -97,14 +95,14 @@ defmodule Codebattle.Game.Fsm do {:ok, game} end - def transition(:timeout, game = %{state: "game_over"}, _params), do: {:ok, game} - def transition(:timeout, game = %{state: "timeout"}, _params), do: {:ok, game} + def transition(:timeout, %{state: "game_over"} = game, _params), do: {:ok, game} + def transition(:timeout, %{state: "timeout"} = game, _params), do: {:ok, game} - def transition(:rematch_reject, game = %{state: "game_over"}, _params) do + def transition(:rematch_reject, %{state: "game_over"} = game, _params) do {:ok, %{game | rematch_state: "rejected"}} end - def transition(:rematch_send_offer, game = %{state: "game_over"}, params) do + def transition(:rematch_send_offer, %{state: "game_over"} = game, params) do new_rematch_data = handle_rematch_offer(game, params) {:ok, Map.merge(game, new_rematch_data)} end @@ -114,9 +112,7 @@ defmodule Codebattle.Game.Fsm do end def transition(transition, game, params) do - Logger.error( - "Unknown transition: #{transition}, game_state: #{game.state}, params: #{inspect(params)}" - ) + Logger.error("Unknown transition: #{transition}, game_state: #{game.state}, params: #{inspect(params)}") {:error, "Unknown transition"} end @@ -125,7 +121,7 @@ defmodule Codebattle.Game.Fsm do %{rematch_state: "in_approval", rematch_initiator_id: params.player_id} end - defp handle_rematch_offer(game = %Game{rematch_state: "in_approval"}, params) do + defp handle_rematch_offer(%Game{rematch_state: "in_approval"} = game, params) do if params.player_id == game.rematch_initiator_id, do: %{}, else: %{rematch_state: "accepted"} end diff --git a/services/app/apps/codebattle/lib/codebattle/game/global_supervisor.ex b/services/app/apps/codebattle/lib/codebattle/game/global_supervisor.ex index fdd6931f0..f56705ab7 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/global_supervisor.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/global_supervisor.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Game.GlobalSupervisor do + @moduledoc false use Supervisor alias Codebattle.Game @@ -26,11 +27,9 @@ defmodule Codebattle.Game.GlobalSupervisor do end def terminate_game(game_id) do - try do - Supervisor.terminate_child(__MODULE__, to_string(game_id)) - Supervisor.delete_child(__MODULE__, to_string(game_id)) - rescue - _ -> Logger.error("cannot terminate game #{game_id}") - end + Supervisor.terminate_child(__MODULE__, to_string(game_id)) + Supervisor.delete_child(__MODULE__, to_string(game_id)) + rescue + _ -> Logger.error("cannot terminate game #{game_id}") end end diff --git a/services/app/apps/codebattle/lib/codebattle/game/helpers.ex b/services/app/apps/codebattle/lib/codebattle/game/helpers.ex index c38607eb3..34a2e1486 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/helpers.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/helpers.ex @@ -14,46 +14,45 @@ defmodule Codebattle.Game.Helpers do def get_rematch_initiator_id(game), do: game.rematch_initiator_id def get_players(game), do: game.players def get_task(game), do: game.task - def get_bots(game), do: game |> get_players |> Enum.filter(fn player -> player.is_bot end) - def get_first_player(game), do: game |> get_players |> Enum.at(0) - def get_second_player(game), do: game |> get_players |> Enum.at(1) + def get_bots(game), do: game |> get_players() |> Enum.filter(fn player -> player.is_bot end) + def get_first_player(game), do: game |> get_players() |> Enum.at(0) + def get_second_player(game), do: game |> get_players() |> Enum.at(1) - def get_first_non_bot(game), - do: game |> get_players |> Enum.find(fn player -> !player.is_bot end) + def get_first_non_bot(game), do: game |> get_players() |> Enum.find(fn player -> !player.is_bot end) - def bot_game?(game), do: game |> get_players |> Enum.any?(fn p -> p.is_bot end) + def bot_game?(game), do: game |> get_players() |> Enum.any?(fn p -> p.is_bot end) def tournament_game?(game), do: get_tournament_id(game) != nil def training_game?(game), do: game.mode == "training" def active_game?(game), do: game.is_live && game.state in ["waiting_opponent", "playing"] def get_winner(game) do game - |> get_players + |> get_players() |> Enum.find(fn player -> player.result == "won" end) end def get_player(game, id) do game - |> get_players + |> get_players() |> Enum.find(fn player -> player.id == id end) end def player?(game, player_id) do game - |> get_players + |> get_players() |> Enum.any?(&(&1.id == player_id)) end def get_opponent(game, player_id) do game - |> get_players + |> get_players() |> Enum.find(&(&1.id != player_id)) end def get_player_results(game) do game |> get_players() - |> Enum.map(fn player -> + |> Map.new(fn player -> result = player |> Map.take([:id, :result, :result_percent]) @@ -61,7 +60,6 @@ defmodule Codebattle.Game.Helpers do {player.id, result} end) - |> Enum.into(%{}) end def winner?(game, player_id), do: player_result?(game, player_id, "won") @@ -72,9 +70,10 @@ defmodule Codebattle.Game.Helpers do def update_player(game, player_id, params) do new_players = Enum.map(game.players, fn player -> - case player.id == player_id do - true -> Map.merge(player, params) - _ -> player + if player.id == player_id do + Map.merge(player, params) + else + player end end) @@ -84,9 +83,10 @@ defmodule Codebattle.Game.Helpers do def update_other_players(game, player_id, params) do new_players = Enum.map(game.players, fn player -> - case player.id != player_id do - true -> Map.merge(player, params) - _ -> player + if player.id == player_id do + player + else + Map.merge(player, params) end end) @@ -105,7 +105,7 @@ defmodule Codebattle.Game.Helpers do defp player_result?(game, player_id, result) do game - |> get_players + |> get_players() |> Enum.find_value(fn p -> p.id == player_id && p.result == result end) |> Kernel.!() |> Kernel.!() diff --git a/services/app/apps/codebattle/lib/codebattle/game/player.ex b/services/app/apps/codebattle/lib/codebattle/game/player.ex index 7f3ece1af..b32d2c9c9 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/player.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/player.ex @@ -2,18 +2,19 @@ defmodule Codebattle.Game.Player do @moduledoc "Struct for player" use Ecto.Schema + import Ecto.Changeset - alias Runner.AtomizedMap alias Codebattle.CodeCheck alias Codebattle.Game.Player alias Codebattle.Tournament alias Codebattle.User alias Codebattle.UserGame + alias Runner.AtomizedMap alias Runner.Languages @primary_key false - @default_editor_text "const _ = require(\"lodash\");\nconst R = require(\"rambda\");\n\nconst solution = () => {\n\n};\n\nmodule.exports = solution;" + @default_editor_text ~s|const _ = require("lodash");\nconst R = require("rambda");\n\nconst solution = () => {\n\n};\n\nmodule.exports = solution;| @derive {Jason.Encoder, only: [ @@ -62,7 +63,7 @@ defmodule Codebattle.Game.Player do field(:result_percent, :float, default: 0.0) end - def changeset(player = %Player{}, attrs) do + def changeset(%Player{} = player, attrs) do player |> cast(attrs, [ :id, @@ -89,7 +90,7 @@ defmodule Codebattle.Game.Player do def build(struct, params \\ %{}) - def build(user_game = %UserGame{}, params) do + def build(%UserGame{} = user_game, params) do player = case user_game.user do nil -> @@ -114,10 +115,10 @@ defmodule Codebattle.Game.Player do } end - Map.merge(player, Map.drop(params, [:task])) + Map.merge(player, Map.delete(params, :task)) end - def build(player = %Tournament.Player{}, params) do + def build(%Tournament.Player{} = player, params) do init_player = %__MODULE__{ id: player.id, is_banned: player.state == "banned", @@ -138,10 +139,10 @@ defmodule Codebattle.Game.Player do task -> setup_editor_params(init_player, task) end - Map.merge(player, Map.drop(params, [:task])) + Map.merge(player, Map.delete(params, :task)) end - def build(player = %Player{}, params) do + def build(%Player{} = player, params) do init_player = %__MODULE__{ id: player.id, is_banned: player.is_banned, @@ -162,10 +163,10 @@ defmodule Codebattle.Game.Player do task -> setup_editor_params(init_player, task) end - Map.merge(player, Map.drop(params, [:task])) + Map.merge(player, Map.delete(params, :task)) end - def build(user = %User{}, params) do + def build(%User{} = user, params) do init_player = case user.id do nil -> @@ -193,10 +194,10 @@ defmodule Codebattle.Game.Player do task -> setup_editor_params(init_player, task) end - Map.merge(player, Map.drop(params, [:task])) + Map.merge(player, Map.delete(params, :task)) end - def setup_editor_params(player = %__MODULE__{}, task) do + def setup_editor_params(%__MODULE__{} = player, task) do editor_lang = player.editor_lang editor_text = CodeCheck.generate_solution_template(task, Languages.meta(editor_lang)) diff --git a/services/app/apps/codebattle/lib/codebattle/game/query.ex b/services/app/apps/codebattle/lib/codebattle/game/query.ex index 3cb16efb6..7076a6c24 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/query.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/query.ex @@ -1,9 +1,10 @@ defmodule Codebattle.Game.Query do + @moduledoc false + import Ecto.Query + alias Codebattle.Game alias Codebattle.Repo - import Ecto.Query - @spec fetch_score_by_game_id(Game.Context.raw_game_id()) :: map() | nil def fetch_score_by_game_id(id) do game = Game.Context.get_game!(id) @@ -77,7 +78,7 @@ defmodule Codebattle.Game.Query do } end - defp completed_games_base_query() do + defp completed_games_base_query do from( g in Game, order_by: [desc: g.id], diff --git a/services/app/apps/codebattle/lib/codebattle/game/rating_calculator.ex b/services/app/apps/codebattle/lib/codebattle/game/rating_calculator.ex index 6c0a665bb..cef3ee2fc 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/rating_calculator.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/rating_calculator.ex @@ -1,26 +1,27 @@ defmodule Codebattle.Game.RatingCalculator do + @moduledoc false alias Codebattle.Game.Elo alias Codebattle.Game.Helpers # skip rating changes for training, bot, solo - def call(game = %{mode: "training"}), do: game - def call(game = %{is_bot: true}), do: game - def call(game = %{type: "solo"}), do: game + def call(%{mode: "training"} = game), do: game + def call(%{is_bot: true} = game), do: game + def call(%{type: "solo"} = game), do: game # skip rating changes gave_up games - def call(game = %{players: [player = %{result: "gave_up"}, _]}) do + def call(%{players: [%{result: "gave_up"} = player, _]} = game) do calculate_gave_up(game, player) end - def call(game = %{players: [_, player = %{result: "gave_up"}]}) do + def call(%{players: [_, %{result: "gave_up"} = player]} = game) do calculate_gave_up(game, player) end - def call(game = %{mode: "standard", players: [winner = %{result: "won"}, loser]}) do + def call(%{mode: "standard", players: [%{result: "won"} = winner, loser]} = game) do calculate(game, winner, loser) end - def call(game = %{mode: "standard", players: [loser, winner = %{result: "won"}]}) do + def call(%{mode: "standard", players: [loser, %{result: "won"} = winner]} = game) do calculate(game, winner, loser) end diff --git a/services/app/apps/codebattle/lib/codebattle/game/server.ex b/services/app/apps/codebattle/lib/codebattle/game/server.ex index c5063d3f0..58bac9f2c 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/server.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/server.ex @@ -3,11 +3,11 @@ defmodule Codebattle.Game.Server do use GenServer - require Logger - alias Codebattle.Game alias Codebattle.Playbook + require Logger + # API def start_link(game) do GenServer.start_link(__MODULE__, game, name: server_name(game.id)) @@ -95,7 +95,7 @@ defmodule Codebattle.Game.Server do {:error, reason} -> {:reply, {:error, reason}, state} - {:ok, new_game = %Game{}} -> + {:ok, %Game{} = new_game} -> if is_record_games do {:reply, {:ok, {game.state, new_game}}, %{ diff --git a/services/app/apps/codebattle/lib/codebattle/game/supervisor.ex b/services/app/apps/codebattle/lib/codebattle/game/supervisor.ex index 436bd0a31..f500e4d58 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/supervisor.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/supervisor.ex @@ -1,10 +1,11 @@ defmodule Codebattle.Game.Supervisor do - require Logger - + @moduledoc false use Supervisor - alias Codebattle.Game alias Codebattle.Bot + alias Codebattle.Game + + require Logger def start_link(game) do Supervisor.start_link(__MODULE__, game, name: supervisor_name(game.id)) @@ -34,6 +35,5 @@ defmodule Codebattle.Game.Supervisor do Supervisor.init(children ++ chat, strategy: :one_for_one) end - defp supervisor_name(game_id), - do: {:via, Registry, {Codebattle.Registry, "game_sup:#{game_id}"}} + defp supervisor_name(game_id), do: {:via, Registry, {Codebattle.Registry, "game_sup:#{game_id}"}} end diff --git a/services/app/apps/codebattle/lib/codebattle/game/tasks_queues_server.ex b/services/app/apps/codebattle/lib/codebattle/game/tasks_queues_server.ex index d2a8c5e82..f599cd5a9 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/tasks_queues_server.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/tasks_queues_server.ex @@ -3,7 +3,7 @@ defmodule Codebattle.Game.TasksQueuesServer do use GenServer - @reshuffle_timeout :timer.hours(7) + @reshuffle_timeout to_timeout(hour: 7) ## Client API diff --git a/services/app/apps/codebattle/lib/codebattle/game/timeout_server.ex b/services/app/apps/codebattle/lib/codebattle/game/timeout_server.ex index 3cd14e14c..74ee5d939 100644 --- a/services/app/apps/codebattle/lib/codebattle/game/timeout_server.ex +++ b/services/app/apps/codebattle/lib/codebattle/game/timeout_server.ex @@ -3,10 +3,10 @@ defmodule Codebattle.Game.TimeoutServer do use GenServer - require Logger - alias Codebattle.Game + require Logger + # API def start_timer(game_id, timeout_seconds) do :ok = GenServer.cast(server_name(game_id), {:start, timeout_seconds}) @@ -29,14 +29,14 @@ defmodule Codebattle.Game.TimeoutServer do def handle_cast({:start, timeout_seconds}, state) do if timeout_seconds >= 0 do - Process.send_after(self(), :trigger_timeout, :timer.seconds(timeout_seconds)) + Process.send_after(self(), :trigger_timeout, to_timeout(second: timeout_seconds)) end {:noreply, state} end def handle_cast({:terminate, timeout_minutes}, state) do - Process.send_after(self(), :trigger_terminate, :timer.minutes(timeout_minutes)) + Process.send_after(self(), :trigger_terminate, to_timeout(minute: timeout_minutes)) {:noreply, state} end @@ -58,6 +58,5 @@ defmodule Codebattle.Game.TimeoutServer do {:noreply, state} end - defp server_name(game_id), - do: {:via, Registry, {Codebattle.Registry, "game_timeout_server:#{game_id}"}} + defp server_name(game_id), do: {:via, Registry, {Codebattle.Registry, "game_timeout_server:#{game_id}"}} end diff --git a/services/app/apps/codebattle/lib/codebattle/invite.ex b/services/app/apps/codebattle/lib/codebattle/invite.ex index 0f87b99ce..7d2e54043 100644 --- a/services/app/apps/codebattle/lib/codebattle/invite.ex +++ b/services/app/apps/codebattle/lib/codebattle/invite.ex @@ -1,17 +1,22 @@ defmodule Codebattle.Invite do + @moduledoc false use Ecto.Schema + import Ecto.Changeset import Ecto.Query, warn: false + alias __MODULE__ alias Codebattle.Game.Context alias Codebattle.Repo - alias __MODULE__ @type t :: %__MODULE__{} defmodule GameParams do + @moduledoc false use Ecto.Schema + import Ecto.Changeset + @primary_key false @timeout_seconds 3600 @@ -28,8 +33,7 @@ defmodule Codebattle.Invite do end end - @derive {Jason.Encoder, - only: [:id, :state, :creator, :recipient, :game_params, :creator_id, :recipient_id]} + @derive {Jason.Encoder, only: [:id, :state, :creator, :recipient, :game_params, :creator_id, :recipient_id]} schema "invites" do field(:state, :string, default: "pending") @@ -50,7 +54,8 @@ defmodule Codebattle.Invite do @spec list_invites() :: [] | [t()] def list_invites do - Repo.all(Invite) + Invite + |> Repo.all() |> Repo.preload([:creator, :recipient]) end @@ -61,18 +66,19 @@ defmodule Codebattle.Invite do where: i.state == "pending" and (i.creator_id == ^user_id or i.recipient_id == ^user_id) ) - Repo.all(query) + query + |> Repo.all() |> Repo.preload([:creator, :recipient]) end @spec list_all_active_invites() :: [] | [t()] - def list_all_active_invites() do + def list_all_active_invites do query = from(i in Invite, where: i.state == "pending" ) - Repo.all(query) |> Repo.preload([:creator, :recipient]) + query |> Repo.all() |> Repo.preload([:creator, :recipient]) end @spec expire_invite(t()) :: t() @@ -92,7 +98,7 @@ defmodule Codebattle.Invite do Repo.exists?(query) end - def get_invite!(id), do: Repo.get!(Invite, id) |> Repo.preload([:creator, :recipient]) + def get_invite!(id), do: Invite |> Repo.get!(id) |> Repo.preload([:creator, :recipient]) def create_invite(attrs \\ %{}) do %Invite{} @@ -104,25 +110,24 @@ defmodule Codebattle.Invite do end end - def update_invite(invite = %Invite{}, attrs) do + def update_invite(%Invite{} = invite, attrs) do invite |> Invite.changeset(attrs) |> Repo.update() end - def delete_invite(invite = %Invite{}) do + def delete_invite(%Invite{} = invite) do Repo.delete(invite) end - def change_invite(invite = %Invite{}, attrs \\ %{}) do + def change_invite(%Invite{} = invite, attrs \\ %{}) do Invite.changeset(invite, attrs) end def drop_invites_by_users(creator_id, recipient_id) do query = from(i in Invite, - where: - i.state == "pending" and (i.creator_id == ^creator_id or i.creator_id == ^recipient_id), + where: i.state == "pending" and (i.creator_id == ^creator_id or i.creator_id == ^recipient_id), select: i ) diff --git a/services/app/apps/codebattle/lib/codebattle/invites_killer_server.ex b/services/app/apps/codebattle/lib/codebattle/invites_killer_server.ex index ac88bde9a..f6fab0e76 100644 --- a/services/app/apps/codebattle/lib/codebattle/invites_killer_server.ex +++ b/services/app/apps/codebattle/lib/codebattle/invites_killer_server.ex @@ -2,6 +2,7 @@ defmodule Codebattle.InvitesKillerServer do @moduledoc "Invites killer server" use GenServer + alias Codebattle.Invite @timeout Application.compile_env(:codebattle, Invite)[:timeout] @@ -21,7 +22,7 @@ defmodule Codebattle.InvitesKillerServer do {:ok, %{}} end - def call() do + def call do GenServer.cast(__MODULE__, :check_invites) end @@ -36,7 +37,7 @@ defmodule Codebattle.InvitesKillerServer do {:noreply, %{}} end - defp expire_outdated_invites() do + defp expire_outdated_invites do invites = Invite.list_all_active_invites() current_time = NaiveDateTime.utc_now() diff --git a/services/app/apps/codebattle/lib/codebattle/playbook.ex b/services/app/apps/codebattle/lib/codebattle/playbook.ex index d1025b45f..3891a0160 100644 --- a/services/app/apps/codebattle/lib/codebattle/playbook.ex +++ b/services/app/apps/codebattle/lib/codebattle/playbook.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Playbook do + @moduledoc false use Ecto.Schema import Ecto.Changeset @@ -27,7 +28,7 @@ defmodule Codebattle.Playbook do end @doc false - def changeset(playbook = %__MODULE__{}, attrs) do + def changeset(%__MODULE__{} = playbook, attrs) do playbook |> cast(attrs, [:game_id, :winner_id, :winner_lang, :solution_type, :task_id]) |> validate_required([ diff --git a/services/app/apps/codebattle/lib/codebattle/playbook/context.ex b/services/app/apps/codebattle/lib/codebattle/playbook/context.ex index e32685ab1..48ce80c17 100644 --- a/services/app/apps/codebattle/lib/codebattle/playbook/context.ex +++ b/services/app/apps/codebattle/lib/codebattle/playbook/context.ex @@ -1,12 +1,14 @@ defmodule Codebattle.Playbook.Context do + @moduledoc false import Ecto.Query - require Logger alias Codebattle.Game alias Codebattle.Playbook alias Codebattle.Repo alias Delta.Op + require Logger + @record_types [ :join_chat, :leave_chat, @@ -20,26 +22,18 @@ defmodule Codebattle.Playbook.Context do ] def get_random_completed_id(task_id) do - from( - p in Playbook, - where: - not is_nil(p.winner_id) and - p.task_id == ^task_id and - p.solution_type == "complete", - order_by: fragment("RANDOM()"), - select: p.id, - limit: 1 + Repo.one( + from(p in Playbook, + where: not is_nil(p.winner_id) and p.task_id == ^task_id and p.solution_type == "complete", + order_by: fragment("RANDOM()"), + select: p.id, + limit: 1 + ) ) - |> Repo.one() end def exists?(game_id) do - from( - p in Playbook, - where: p.game_id == ^game_id, - limit: 1 - ) - |> Repo.one() + Repo.one(from(p in Playbook, where: p.game_id == ^game_id, limit: 1)) end def init_records(players) do @@ -64,13 +58,7 @@ defmodule Codebattle.Playbook.Context do end def add_record(playbook_state, type, params) when type in @record_types do - record = - %{ - type: type, - record_id: playbook_state.id, - time: System.system_time(:millisecond) - } - |> Map.merge(params) + record = Map.merge(%{type: type, record_id: playbook_state.id, time: System.system_time(:millisecond)}, params) playbook_state |> Map.update!(:records, &[record | &1]) @@ -95,15 +83,14 @@ defmodule Codebattle.Playbook.Context do task_id = Game.Helpers.get_task(game).id data = build_playbook_data(playbook_records) - %Playbook{ + Repo.insert(%Playbook{ data: data, task_id: task_id, game_id: String.to_integer(to_string(game_id)), winner_id: winner && winner.id, winner_lang: winner && winner.editor_lang, solution_type: get_solution_type(winner, game) - } - |> Repo.insert() + }) end defp build_playbook_data(playbook_records) do @@ -116,7 +103,7 @@ defmodule Codebattle.Playbook.Context do |> Map.update!(:players, &Enum.reverse/1) end - defp add_record_to_playbook_data(record = %{type: :init}, data) do + defp add_record_to_playbook_data(%{type: :init} = record, data) do player = Map.merge(record, %{type: :player_state, total_time_ms: 0}) data @@ -124,10 +111,7 @@ defmodule Codebattle.Playbook.Context do |> update_history(record) end - defp add_record_to_playbook_data( - record = %{type: :update_editor_data, record_id: record_id, id: id, time: time}, - data - ) do + defp add_record_to_playbook_data(%{type: :update_editor_data, record_id: record_id, id: id, time: time} = record, data) do player_state = Enum.find(data.players, &(&1.id == id)) diff = create_diff(player_state, record) new_player_state = update_editor_state(player_state, record, diff.time) @@ -156,37 +140,27 @@ defmodule Codebattle.Playbook.Context do %{next_lang: editor_lang} end - %{ - delta: Delta.diff(player_state_delta, new_delta), - time: time - player_state.time - } - |> Map.merge(lang_delta) + Map.merge(%{delta: Delta.diff(player_state_delta, new_delta), time: time - player_state.time}, lang_delta) end - defp update_players_state(data, player_state), - do: Map.update!(data, :players, &update_player(&1, player_state)) + defp update_players_state(data, player_state), do: Map.update!(data, :players, &update_player(&1, player_state)) - defp update_player(players, player_state = %{id: id}), + defp update_player(players, %{id: id} = player_state), do: Enum.map(players, fn %{id: ^id} -> player_state player -> player end) - defp update_editor_state( - player_state, - %{time: time, editor_text: editor_text, editor_lang: editor_lang}, - diff_time - ), - do: - player_state - |> Map.put(:editor_text, editor_text) - |> Map.put(:editor_lang, editor_lang) - |> Map.put(:time, time) - |> Map.update!(:total_time_ms, &(&1 + diff_time)) - - defp update_history(data, record), - do: Map.update!(data, :records, &[record | &1]) |> increase_count + defp update_editor_state(player_state, %{time: time, editor_text: editor_text, editor_lang: editor_lang}, diff_time), + do: + player_state + |> Map.put(:editor_text, editor_text) + |> Map.put(:editor_lang, editor_lang) + |> Map.put(:time, time) + |> Map.update!(:total_time_ms, &(&1 + diff_time)) + + defp update_history(data, record), do: data |> Map.update!(:records, &[record | &1]) |> increase_count() defp create_delta(nil), do: Op.insert("") defp create_delta(text), do: Op.insert(text) diff --git a/services/app/apps/codebattle/lib/codebattle/premium_request.ex b/services/app/apps/codebattle/lib/codebattle/premium_request.ex index f23998014..271255ad0 100644 --- a/services/app/apps/codebattle/lib/codebattle/premium_request.ex +++ b/services/app/apps/codebattle/lib/codebattle/premium_request.ex @@ -48,8 +48,7 @@ defmodule Codebattle.PremiumRequest do |> Repo.insert() end - def all() do - __MODULE__ - |> Repo.all() + def all do + Repo.all(__MODULE__) end end diff --git a/services/app/apps/codebattle/lib/codebattle/pub_sub.ex b/services/app/apps/codebattle/lib/codebattle/pub_sub.ex index afc985897..a9c104b7b 100644 --- a/services/app/apps/codebattle/lib/codebattle/pub_sub.ex +++ b/services/app/apps/codebattle/lib/codebattle/pub_sub.ex @@ -1,4 +1,5 @@ defmodule Codebattle.PubSub do + @moduledoc false alias Codebattle.PubSub.Events alias Codebattle.PubSub.Message diff --git a/services/app/apps/codebattle/lib/codebattle/pub_sub/events.ex b/services/app/apps/codebattle/lib/codebattle/pub_sub/events.ex index 99f40702e..8acf90006 100644 --- a/services/app/apps/codebattle/lib/codebattle/pub_sub/events.ex +++ b/services/app/apps/codebattle/lib/codebattle/pub_sub/events.ex @@ -1,4 +1,5 @@ defmodule Codebattle.PubSub.Events do + @moduledoc false alias Codebattle.Game alias Codebattle.PubSub.Message alias Codebattle.Tournament diff --git a/services/app/apps/codebattle/lib/codebattle/repo.ex b/services/app/apps/codebattle/lib/codebattle/repo.ex index 81acd6f14..e3fabd01b 100644 --- a/services/app/apps/codebattle/lib/codebattle/repo.ex +++ b/services/app/apps/codebattle/lib/codebattle/repo.ex @@ -19,8 +19,7 @@ defmodule Codebattle.Repo do |> exclude(:order_by) |> exclude(:select) - from(u in subquery(query)) - |> Repo.count() + Repo.count(from(u in subquery(query))) else 0 end diff --git a/services/app/apps/codebattle/lib/codebattle/task.ex b/services/app/apps/codebattle/lib/codebattle/task.ex index 25f5c41e6..8b8975358 100644 --- a/services/app/apps/codebattle/lib/codebattle/task.ex +++ b/services/app/apps/codebattle/lib/codebattle/task.ex @@ -2,6 +2,7 @@ defmodule Codebattle.Task do @moduledoc false use Ecto.Schema + import Ecto.Changeset import Ecto.Query @@ -155,9 +156,7 @@ defmodule Codebattle.Task do __MODULE__ |> filter_visibility(user) |> Repo.all() - |> Enum.sort_by( - &{@origin_order[&1.origin], @state_order[&1.state], @level_order[&1.level], &1.name} - ) + |> Enum.sort_by(&{@origin_order[&1.origin], @state_order[&1.state], @level_order[&1.level], &1.name}) end defp filter_visibility(query, user) do @@ -221,7 +220,7 @@ defmodule Codebattle.Task do end @spec list_task_ids() :: list(integer()) - def list_task_ids() do + def list_task_ids do from(task in Codebattle.Task) |> visible() |> select([x], x.id) @@ -240,9 +239,7 @@ defmodule Codebattle.Task do comment: "", level: "elementary", input_signature: [], - output_signature: %{ - type: %{name: "integer"} - }, + output_signature: %{type: %{name: "integer"}}, asserts: [], asserts_examples: [], tags: [], @@ -272,7 +269,7 @@ defmodule Codebattle.Task do end @spec get_all_visible() :: list(t()) - def get_all_visible() do + def get_all_visible do from(task in Codebattle.Task) |> visible() |> Repo.all() @@ -280,8 +277,7 @@ defmodule Codebattle.Task do @spec get_played_count(integer()) :: integer() def get_played_count(task_id) do - from(game in Codebattle.Game, where: game.task_id == ^task_id) - |> Repo.count() + Repo.count(from(game in Codebattle.Game, where: game.task_id == ^task_id)) end @spec can_see_task?(t(), User.t()) :: boolean() diff --git a/services/app/apps/codebattle/lib/codebattle/task_pack.ex b/services/app/apps/codebattle/lib/codebattle/task_pack.ex index fcb00a9aa..95dc5f32b 100644 --- a/services/app/apps/codebattle/lib/codebattle/task_pack.ex +++ b/services/app/apps/codebattle/lib/codebattle/task_pack.ex @@ -2,6 +2,7 @@ defmodule Codebattle.TaskPack do @moduledoc false use Ecto.Schema + import Ecto.Changeset import Ecto.Query @@ -52,7 +53,7 @@ defmodule Codebattle.TaskPack do def get_by!(params), do: Repo.get_by!(__MODULE__, params) def get_by(params), do: Repo.get_by(__MODULE__, params) - def get_tasks(task_pack = %__MODULE__{}) do + def get_tasks(%__MODULE__{} = task_pack) do query = from(t in Task, where: t.id in ^task_pack.task_ids) Repo.all(query) end @@ -94,8 +95,7 @@ defmodule Codebattle.TaskPack do defp retrieve_tasks_from_task_pack(task_pack) do tasks = Codebattle.Task.get_by_ids(task_pack.task_ids) - task_pack.task_ids - |> Enum.map(fn task_id -> Enum.find(tasks, fn task -> task.id == task_id end) end) + Enum.map(task_pack.task_ids, fn task_id -> Enum.find(tasks, fn task -> task.id == task_id end) end) end def list_visible(user) do diff --git a/services/app/apps/codebattle/lib/codebattle/tasks_importer.ex b/services/app/apps/codebattle/lib/codebattle/tasks_importer.ex index 3c01f36eb..5d5529d4c 100644 --- a/services/app/apps/codebattle/lib/codebattle/tasks_importer.ex +++ b/services/app/apps/codebattle/lib/codebattle/tasks_importer.ex @@ -5,7 +5,7 @@ defmodule Codebattle.TasksImporter do require Logger - @timeout :timer.hours(12) + @timeout to_timeout(hour: 12) @issues_link "https://github.com/hexlet-codebattle/battle_asserts/releases/latest/download/issues.tar.gz" @tmp_basedir "/tmp/codebattle-issues" @@ -19,24 +19,24 @@ defmodule Codebattle.TasksImporter do end def run_sync do - fetch_issues() |> upsert() + upsert(fetch_issues()) end # SERVER def init(state) do Logger.debug("Start Tasks Importer") - Process.send_after(self(), :run, :timer.seconds(17)) + Process.send_after(self(), :run, to_timeout(second: 17)) {:ok, state} end def handle_info(:run, state) do - fetch_issues() |> upsert() + upsert(fetch_issues()) Process.send_after(self(), :run, @timeout) {:noreply, state} end def handle_cast(:run, state) do - fetch_issues() |> upsert() + upsert(fetch_issues()) {:noreply, state} end @@ -58,12 +58,11 @@ defmodule Codebattle.TasksImporter do issue_names = path |> File.ls!() - |> Enum.map(fn file_name -> + |> MapSet.new(fn file_name -> file_name |> String.split(".") |> List.first() end) - |> MapSet.new() |> Enum.filter(fn x -> String.length(x) > 0 end) Enum.each(issue_names, fn issue_name -> @@ -106,7 +105,7 @@ defmodule Codebattle.TasksImporter do } end - defp format_input_signature(input = %{"argument-name" => arg}) do + defp format_input_signature(%{"argument-name" => arg} = input) do input |> Map.delete("argument-name") |> Map.put("argument_name", arg) end diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/clans.ex b/services/app/apps/codebattle/lib/codebattle/tournament/clans.ex index fa4f4e7e0..70ef0eda2 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/clans.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/clans.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Clans do + @moduledoc false alias Codebattle.Tournament alias Codebattle.Tournament.Storage.Clans diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/context.ex b/services/app/apps/codebattle/lib/codebattle/tournament/context.ex index 7e49e8f30..dca8840a7 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/context.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/context.ex @@ -1,14 +1,15 @@ defmodule Codebattle.Tournament.Context do + @moduledoc false + import Ecto.Changeset + import Ecto.Query + + alias Codebattle.Event alias Codebattle.Game alias Codebattle.Repo - alias Codebattle.Event alias Codebattle.Tournament alias Codebattle.User alias Runner.AtomizedMap - import Ecto.Query - import Ecto.Changeset - @type tournament_id :: pos_integer() | String.t() @type event_id :: pos_integer() | String.t() @@ -80,24 +81,17 @@ defmodule Codebattle.Tournament.Context do @spec get_db_tournaments(nonempty_list(String.t())) :: list(Tournament.t()) def get_db_tournaments(states) do - from( - t in Tournament, - order_by: [desc: t.id], - where: t.state in ^states, - limit: 15, - preload: [:creator] - ) - |> Repo.all() + Repo.all(from(t in Tournament, order_by: [desc: t.id], where: t.state in ^states, limit: 15, preload: [:creator])) end @spec get_all_by_event_id!(event_id()) :: Event.t() | no_return() def get_all_by_event_id!(event_id) do - from( - t in Tournament, - order_by: t.starts_at, - where: t.event_id == ^event_id and t.state in ["waiting_participants", "active", "finished"] + Repo.all( + from(t in Tournament, + order_by: t.starts_at, + where: t.event_id == ^event_id and t.state in ["waiting_participants", "active", "finished"] + ) ) - |> Repo.all() end @spec get_live_tournaments() :: list(Tournament.t()) @@ -116,7 +110,7 @@ defmodule Codebattle.Tournament.Context do end @spec get_live_tournaments_count() :: non_neg_integer() - def get_live_tournaments_count, do: get_live_tournaments() |> Enum.count() + def get_live_tournaments_count, do: Enum.count(get_live_tournaments()) @spec validate(map(), Tournament.t()) :: Ecto.Changeset.t() def validate(params, tournament \\ %Tournament{}) do @@ -127,8 +121,7 @@ defmodule Codebattle.Tournament.Context do @spec create(map()) :: {:ok, Tournament.t()} | {:error, Ecto.Changeset.t()} def create(params) do - changeset = - %Tournament{} |> Tournament.changeset(prepare_tournament_params(params)) + changeset = Tournament.changeset(%Tournament{}, prepare_tournament_params(params)) alive_count = get_live_tournaments_count() @@ -197,10 +190,10 @@ defmodule Codebattle.Tournament.Context do def upsert!(tournament, :with_ets) do players = - tournament |> Tournament.Players.get_players() |> Enum.map(&{&1.id, &1}) |> Enum.into(%{}) + tournament |> Tournament.Players.get_players() |> Map.new(&{&1.id, &1}) matches = - tournament |> Tournament.Matches.get_matches() |> Enum.map(&{&1.id, &1}) |> Enum.into(%{}) + tournament |> Tournament.Matches.get_matches() |> Map.new(&{&1.id, &1}) tournament |> Map.put(:updated_at, TimeHelper.utc_now()) @@ -335,8 +328,8 @@ defmodule Codebattle.Tournament.Context do defp add_module(tournament), do: Map.put(tournament, :module, get_module(tournament)) - defp generate_access_token() do - :crypto.strong_rand_bytes(17) |> Base.url_encode64() |> binary_part(0, 17) + defp generate_access_token do + 17 |> :crypto.strong_rand_bytes() |> Base.url_encode64() |> binary_part(0, 17) end defp cast_json_value(value) do diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/global_supervisor.ex b/services/app/apps/codebattle/lib/codebattle/tournament/global_supervisor.ex index a4f01cac2..ed5e326f8 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/global_supervisor.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/global_supervisor.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.GlobalSupervisor do + @moduledoc false use Supervisor alias Codebattle.Tournament @@ -28,18 +29,15 @@ defmodule Codebattle.Tournament.GlobalSupervisor do end def terminate_tournament(tournament_id) do - try do - Supervisor.terminate_child(__MODULE__, to_string(tournament_id)) - Supervisor.delete_child(__MODULE__, to_string(tournament_id)) - rescue - _ -> Logger.error("tournament not found while terminating #{tournament_id}") - end + Supervisor.terminate_child(__MODULE__, to_string(tournament_id)) + Supervisor.delete_child(__MODULE__, to_string(tournament_id)) + rescue + _ -> Logger.error("tournament not found while terminating #{tournament_id}") end - defp restore_tournaments() do + defp restore_tournaments do if Application.get_env(:codebattle, :restore_tournaments) do - Tournament.Context.get_tournament_for_restore() - |> Enum.each(fn tournament -> + Enum.each(Tournament.Context.get_tournament_for_restore(), fn tournament -> Supervisor.start_child( __MODULE__, %{ diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/helpers.ex b/services/app/apps/codebattle/lib/codebattle/tournament/helpers.ex index 0167c7e84..cf2cec010 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/helpers.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/helpers.ex @@ -1,24 +1,23 @@ defmodule Codebattle.Tournament.Helpers do - alias Codebattle.User + @moduledoc false alias Codebattle.Tournament + alias Codebattle.User - def get_player(tournament = %{players_table: nil}, id), - do: Map.get(tournament.players, to_id(id)) + def get_player(%{players_table: nil} = tournament, id), do: Map.get(tournament.players, to_id(id)) def get_player(tournament, id), do: Tournament.Players.get_player(tournament, id) - def get_players(tournament = %{players_table: nil}), do: tournament.players |> Map.values() + def get_players(%{players_table: nil} = tournament), do: Map.values(tournament.players) def get_players(tournament), do: Tournament.Players.get_players(tournament) - def get_players(tournament = %{players_table: nil}, ids), - do: Enum.map(ids, &get_player(tournament, &1)) + def get_players(%{players_table: nil} = tournament, ids), do: Enum.map(ids, &get_player(tournament, &1)) def get_players(tournament, ids), do: Tournament.Players.get_players(tournament, ids) - def get_tasks(_tournament = %{tasks_table: nil}), do: [] + def get_tasks(%{tasks_table: nil} = _tournament), do: [] def get_tasks(tournament), do: Tournament.Tasks.get_tasks(tournament) - def players_count(tournament = %{players_table: nil}) do + def players_count(%{players_table: nil} = tournament) do tournament |> get_players() |> Enum.count() end @@ -26,7 +25,7 @@ defmodule Codebattle.Tournament.Helpers do Tournament.Players.count(tournament) end - def get_paginated_players(tournament = %{players_table: nil}, _page_num, _page_size) do + def get_paginated_players(%{players_table: nil} = tournament, _page_num, _page_size) do # return all players, cause we don't want to paginate if tournament finished get_players(tournament) end @@ -45,23 +44,20 @@ defmodule Codebattle.Tournament.Helpers do tournament |> get_team_players(team_id) |> Enum.count() end - def get_match(tournament = %{matches_table: nil}, id), - do: Map.get(tournament.matches, to_id(id)) + def get_match(%{matches_table: nil} = tournament, id), do: Map.get(tournament.matches, to_id(id)) def get_match(tournament, id), do: Tournament.Matches.get_match(tournament, id) - def get_matches(tournament = %{matches_table: nil}), do: tournament.matches |> Map.values() + def get_matches(%{matches_table: nil} = tournament), do: Map.values(tournament.matches) def get_matches(tournament), do: Tournament.Matches.get_matches(tournament) - def get_matches(tournament, ids) when is_list(ids), - do: Enum.map(ids, &get_match(tournament, &1)) + def get_matches(tournament, ids) when is_list(ids), do: Enum.map(ids, &get_match(tournament, &1)) def get_matches(tournament, state) when is_binary(state) do tournament |> get_matches() |> Enum.filter(&(&1.state == state)) end - def get_matches(tournament, ids_or_state), - do: Tournament.Matches.get_matches(tournament, ids_or_state) + def get_matches(tournament, ids_or_state), do: Tournament.Matches.get_matches(tournament, ids_or_state) def get_matches_by_players(tournament, player_ids) do matches_ids = @@ -100,7 +96,7 @@ defmodule Codebattle.Tournament.Helpers do |> Enum.reject(&is_nil/1) |> Enum.uniq() - opponent_ids |> Enum.map(&get_player(tournament, &1)) + Enum.map(opponent_ids, &get_player(tournament, &1)) end def matches_count(t), do: Tournament.Matches.count(t) @@ -112,26 +108,24 @@ defmodule Codebattle.Tournament.Helpers do end def get_round_matches(tournament, round_position) do - tournament |> get_matches |> Enum.filter(&(&1.round_position == round_position)) + tournament |> get_matches() |> Enum.filter(&(&1.round_position == round_position)) end def get_current_round_playing_matches(tournament) do tournament |> get_matches() - |> Enum.filter( - &(&1.round_position == tournament.current_round_position and &1.state == "playing") - ) + |> Enum.filter(&(&1.round_position == tournament.current_round_position and &1.state == "playing")) end def match_player?(match, player_id), do: Enum.any?(match.player_ids, &(&1 == player_id)) - def get_player_ids(tournament), do: tournament |> get_players |> Enum.map(& &1.id) + def get_player_ids(tournament), do: tournament |> get_players() |> Enum.map(& &1.id) - def get_opponent_id(_match = %{player_ids: [p1_id, p2_id]}, p1_id), do: p2_id - def get_opponent_id(_match = %{player_ids: [p2_id, p1_id]}, p1_id), do: p2_id + def get_opponent_id(%{player_ids: [p1_id, p2_id]} = _match, p1_id), do: p2_id + def get_opponent_id(%{player_ids: [p2_id, p1_id]} = _match, p1_id), do: p2_id def get_opponent_id(_match, _p_id), do: nil - def can_be_started?(tournament = %{state: "waiting_participants"}) do + def can_be_started?(%{state: "waiting_participants"} = tournament) do players_count(tournament) > 0 end @@ -141,7 +135,7 @@ defmodule Codebattle.Tournament.Helpers do creator?(tournament, user) || User.admin?(user) end - def can_access?(tournament = %{access_type: "token"}, user, params) do + def can_access?(%{access_type: "token"} = tournament, user, params) do can_moderate?(tournament, user) || player?(tournament, user.id) || params["access_token"] == tournament.access_token @@ -189,8 +183,8 @@ defmodule Codebattle.Tournament.Helpers do def get_teams(%{meta: %{teams: teams}}), do: Map.values(teams) def get_teams(_), do: [] - def get_team_players(tournament = %{type: "team"}, team_id) do - tournament |> get_players |> Enum.filter(&(&1.team_id == team_id)) + def get_team_players(%{type: "team"} = tournament, team_id) do + tournament |> get_players() |> Enum.filter(&(&1.team_id == team_id)) end def get_clans_by_ranking(%{use_clan: false}, _), do: %{} diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/match.ex b/services/app/apps/codebattle/lib/codebattle/tournament/match.ex index 38f5444f7..a7b586ca7 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/match.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/match.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Match do + @moduledoc false use Ecto.Schema import Ecto.Changeset diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_clan.ex b/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_clan.ex index c89a9b886..8c84c1e73 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_clan.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_clan.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.PairBuilder.ByClan do + @moduledoc false @opaque player_id :: pos_integer() @opaque clan_id :: pos_integer() @opaque player :: {player_id(), clan_id()} @@ -10,10 +11,9 @@ defmodule Codebattle.Tournament.PairBuilder.ByClan do grouped_players = players |> Enum.group_by(&elem(&1, 1), &elem(&1, 0)) - |> Enum.map(fn {clan_id, player_ids} -> + |> Map.new(fn {clan_id, player_ids} -> {clan_id, {length(player_ids), clan_id, player_ids}} end) - |> Map.new() match_players(grouped_players, []) end @@ -47,8 +47,7 @@ defmodule Codebattle.Tournament.PairBuilder.ByClan do end new_players_map = - players_map - |> then(fn pm -> + then(players_map, fn pm -> if clan1_count == 1 do Map.delete(pm, clan1_id) else @@ -57,8 +56,7 @@ defmodule Codebattle.Tournament.PairBuilder.ByClan do end) new_players_map = - new_players_map - |> then(fn pm -> + then(new_players_map, fn pm -> if clan2_count == 1 do Map.delete(pm, clan2_id) else diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_clan_and_score.ex b/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_clan_and_score.ex index 7ce6f4494..6274a0c04 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_clan_and_score.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_clan_and_score.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.PairBuilder.ByClanAndScore do + @moduledoc false @opaque player_id :: pos_integer() @opaque clan_id :: pos_integer() @opaque score :: pos_integer() @@ -19,19 +20,17 @@ defmodule Codebattle.Tournament.PairBuilder.ByClanAndScore do {pairs, [elem(player, 0) | unmatched_player_ids]} end - defp match_players([{p1_id, c1_id, _s1}, {p2_id, c2_id, _s2}], pairs, unmatched_player_ids) - when c1_id != c2_id do + defp match_players([{p1_id, c1_id, _s1}, {p2_id, c2_id, _s2}], pairs, unmatched_player_ids) when c1_id != c2_id do {[[p1_id, p2_id] | pairs], unmatched_player_ids} end - defp match_players([{p1_id, c1_id, _s1}, {p2_id, c2_id, _s2}], pairs, unmatched_player_ids) - when c1_id == c2_id do + defp match_players([{p1_id, c1_id, _s1}, {p2_id, c2_id, _s2}], pairs, unmatched_player_ids) when c1_id == c2_id do {pairs, [p1_id, p2_id | unmatched_player_ids]} end defp match_players([{p1_id, c1_id, _s1} | remained_players], pairs, unmatched_player_ids) do - Enum.reduce_while( - remained_players, + remained_players + |> Enum.reduce_while( nil, fn {p2_id, c2_id, _s}, _acc -> if c1_id == c2_id do diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_score.ex b/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_score.ex index 0463ba764..1f80d7161 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_score.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/pair_builder/by_score.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.PairBuilder.ByScore do + @moduledoc false @opaque player_id :: pos_integer() @opaque score :: pos_integer() @opaque player :: {player_id(), score()} diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/player.ex b/services/app/apps/codebattle/lib/codebattle/tournament/player.ex index 3901098d3..336320044 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/player.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/player.ex @@ -1,5 +1,7 @@ defmodule Codebattle.Tournament.Player do + @moduledoc false use Ecto.Schema + import Ecto.Changeset @type t :: %__MODULE__{} @@ -56,9 +58,9 @@ defmodule Codebattle.Tournament.Player do end @spec new!(params :: map()) :: t() - def new!(params = %_{}), do: params |> Map.from_struct() |> new!() + def new!(%_{} = params), do: params |> Map.from_struct() |> new!() - def new!(params = %{}) do + def new!(%{} = params) do %__MODULE__{} |> cast(params, @fields) |> validate_required([:id, :name]) diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/ranking.ex b/services/app/apps/codebattle/lib/codebattle/tournament/ranking.ex index 65778acc8..9025ea08c 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/ranking.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/ranking.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Ranking do + @moduledoc false alias Codebattle.Tournament alias Codebattle.Tournament.Ranking.ByClan alias Codebattle.Tournament.Ranking.ByPlayer @@ -31,8 +32,7 @@ defmodule Codebattle.Tournament.Ranking do end @spec get_page(tournament :: Tournament.t(), page :: pos_integer()) :: map() - def get_page(%{ranking_table: nil}, _page), - do: %{total_entries: 0, page_number: 1, page_size: 10, entries: []} + def get_page(%{ranking_table: nil}, _page), do: %{total_entries: 0, page_number: 1, page_size: 10, entries: []} def get_page(tournament, page) do get_module(tournament).get_page(tournament, page) @@ -72,8 +72,7 @@ defmodule Codebattle.Tournament.Ranking do end @spec preload_event_ranking(Tournament.t()) :: Tournament.t() - def preload_event_ranking(tournament = %{use_event_ranking: true, event_id: event_id}) - when not is_nil(event_id) do + def preload_event_ranking(%{use_event_ranking: true, event_id: event_id} = tournament) when not is_nil(event_id) do # ranking = get_module(tournament).get_event_ranking(tournament) # Ranking.put_ranking(tournament, ranking) diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_clan.ex b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_clan.ex index 0e80c3a30..039033dbb 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_clan.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_clan.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Ranking.ByClan do + @moduledoc false alias Codebattle.Event.EventClanResult alias Codebattle.Tournament.Helpers alias Codebattle.Tournament.Storage.Ranking diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_player.ex b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_player.ex index 17f5f34e1..cfe6650ec 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_player.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_player.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Ranking.ByPlayer do + @moduledoc false @page_size 10 def get_first(_tournament, _limit \\ @page_size) do diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_player_95th_percentile.ex b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_player_95th_percentile.ex index 6c7289b7f..f1af3cb7b 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_player_95th_percentile.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/by_player_95th_percentile.ex @@ -1,7 +1,8 @@ defmodule Codebattle.Tournament.Ranking.ByPlayer95thPercentile do - alias Codebattle.Tournament.TournamentResult - alias Codebattle.Tournament.Storage.Ranking + @moduledoc false alias Codebattle.Tournament.Players + alias Codebattle.Tournament.Storage.Ranking + alias Codebattle.Tournament.TournamentResult @page_size 10 @@ -56,7 +57,7 @@ defmodule Codebattle.Tournament.Ranking.ByPlayer95thPercentile do :ok end - def add_new_player(tournament = %{state: "waiting_participants"}, player) do + def add_new_player(%{state: "waiting_participants"} = tournament, player) do place = Ranking.count(tournament) + 1 Ranking.put_single_record(tournament, place, %{ diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/update_from_results_server.ex b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/update_from_results_server.ex index 7d5c4b5ca..12431dd72 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/update_from_results_server.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/update_from_results_server.ex @@ -1,12 +1,14 @@ defmodule Codebattle.Tournament.Ranking.UpdateFromResultsServer do + @moduledoc false use GenServer - require Logger alias Codebattle.Tournament alias Codebattle.Tournament.Ranking alias Codebattle.Tournament.TournamentResult - @interval :timer.seconds(10) + require Logger + + @interval to_timeout(second: 10) # API def start_link(tournament_id) do @@ -15,14 +17,12 @@ defmodule Codebattle.Tournament.Ranking.UpdateFromResultsServer do @spec update(tournament :: Tournament.t()) :: :ok | {:error, :not_found} def update(tournament) do - try do - GenServer.call(server_name(tournament.id), :update) - :ok - catch - :exit, reason -> - Logger.error("Error to send tournament ranking update: #{inspect(reason)}") - {:error, :not_found} - end + GenServer.call(server_name(tournament.id), :update) + :ok + catch + :exit, reason -> + Logger.error("Error to send tournament ranking update: #{inspect(reason)}") + {:error, :not_found} end # SERVER @@ -60,13 +60,7 @@ defmodule Codebattle.Tournament.Ranking.UpdateFromResultsServer do end end - def handle_info( - %{ - topic: "game:tournament:" <> _t_id, - event: "game:tournament:finished" - }, - state - ) do + def handle_info(%{topic: "game:tournament:" <> _t_id, event: "game:tournament:finished"}, state) do {:noreply, %{state | updates_received: true}} end @@ -80,10 +74,9 @@ defmodule Codebattle.Tournament.Ranking.UpdateFromResultsServer do Ranking.set_ranking_to_ets(tournament) end - defp schedule_work() do + defp schedule_work do Process.send_after(self(), :work, @interval) end - defp server_name(id), - do: {:via, Registry, {Codebattle.Registry, "tournament_update_ranking_srv::#{id}"}} + defp server_name(id), do: {:via, Registry, {Codebattle.Registry, "tournament_update_ranking_srv::#{id}"}} end diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/void.ex b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/void.ex index ca541a837..fc5ce97e5 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/ranking/void.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/ranking/void.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Ranking.Void do + @moduledoc false def get_first(_tournament, _limit \\ 0) do [] end diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/round.ex b/services/app/apps/codebattle/lib/codebattle/tournament/round.ex index f63f2ab3c..a8f5624ba 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/round.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/round.ex @@ -2,6 +2,7 @@ defmodule Codebattle.Tournament.Round do @moduledoc false use Ecto.Schema + import Ecto.Changeset import Ecto.Query @@ -70,12 +71,13 @@ defmodule Codebattle.Tournament.Round do end def disable_all_rounds(tournament_id) do - from( - r in __MODULE__, - where: r.tournament_id == ^tournament_id and r.state == "active", - update: [set: [state: "disabled"]] + Codebattle.Repo.update_all( + from(r in __MODULE__, + where: r.tournament_id == ^tournament_id and r.state == "active", + update: [set: [state: "disabled"]] + ), + [] ) - |> Codebattle.Repo.update_all([]) end def states, do: @states diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/round/context.ex b/services/app/apps/codebattle/lib/codebattle/tournament/round/context.ex index e8a9de0a2..7e401578e 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/round/context.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/round/context.ex @@ -10,18 +10,20 @@ defmodule Codebattle.Tournament.Round.Context do @spec upsert!(Tournament.t()) :: Round.t() def build(tournament) do - %Round{ - state: "active", - break_duration_seconds: tournament.break_duration_seconds, - level: tournament.level, - player_ids: Tournament.Players.get_players(tournament) |> Enum.map(& &1.id), - task_provider: tournament.task_provider, - task_strategy: tournament.task_strategy, - tournament_id: tournament.id, - tournament_type: tournament.type, - use_infinite_break: tournament.use_infinite_break - } - |> add_round_timeout_and_task_pack(tournament) + add_round_timeout_and_task_pack( + %Round{ + state: "active", + break_duration_seconds: tournament.break_duration_seconds, + level: tournament.level, + player_ids: tournament |> Tournament.Players.get_players() |> Enum.map(& &1.id), + task_provider: tournament.task_provider, + task_strategy: tournament.task_strategy, + tournament_id: tournament.id, + tournament_type: tournament.type, + use_infinite_break: tournament.use_infinite_break + }, + tournament + ) end @spec upsert!(Round.t()) :: Round.t() @@ -36,9 +38,7 @@ defmodule Codebattle.Tournament.Round.Context do @spec upsert_all(list(Round.t())) :: list(Round.t()) def upsert_all(rounds) do - rounds = - rounds - |> Enum.map(&(&1 |> Map.put(:updated_at, TimeHelper.utc_now()))) + rounds = Enum.map(rounds, &Map.put(&1, :updated_at, TimeHelper.utc_now())) Codebattle.Repo.insert_all( Round, @@ -51,9 +51,7 @@ defmodule Codebattle.Tournament.Round.Context do @spec add_round_timeout_and_task_pack(Round.t(), Tournament.t()) :: Round.t() defp add_round_timeout_and_task_pack( round, - tournament = %{ - meta: %{rounds_config_type: "per_round", rounds_config: rounds_config} - } + %{meta: %{rounds_config_type: "per_round", rounds_config: rounds_config}} = tournament ) do round_config = Enum.at(rounds_config, tournament.current_round_position) diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/server.ex b/services/app/apps/codebattle/lib/codebattle/tournament/server.ex index 27878d74b..378f56dbd 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/server.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/server.ex @@ -1,15 +1,17 @@ defmodule Codebattle.Tournament.Server do + @moduledoc false use GenServer - require Logger + + import Codebattle.Tournament.Helpers alias Codebattle.Clan alias Codebattle.Tournament alias Codebattle.WaitingRoom - import Tournament.Helpers + require Logger @type tournament_id :: pos_integer() - @waiting_room_timeout_ms :timer.seconds(1) + @waiting_room_timeout_ms to_timeout(second: 1) # API def start_link(tournament_id) do GenServer.start(__MODULE__, tournament_id, name: server_name(tournament_id)) @@ -24,79 +26,67 @@ defmodule Codebattle.Tournament.Server do end def get_tournament_info(id) do - try do - GenServer.call(server_name(id), :get_tournament_info) - catch - :exit, {:noproc, _} -> - nil - - :exit, reason -> - Logger.error("Error to get tournament: #{inspect(reason)}") - nil - end + GenServer.call(server_name(id), :get_tournament_info) + catch + :exit, {:noproc, _} -> + nil + + :exit, reason -> + Logger.error("Error to get tournament: #{inspect(reason)}") + nil end def get_tournament(id) do - try do - GenServer.call(server_name(id), :get_tournament) - catch - :exit, {:noproc, _} -> - nil - - :exit, reason -> - Logger.error("Error to get tournament: #{inspect(reason)}") - nil - end + GenServer.call(server_name(id), :get_tournament) + catch + :exit, {:noproc, _} -> + nil + + :exit, reason -> + Logger.error("Error to get tournament: #{inspect(reason)}") + nil end def update_tournament(tournament) do - try do - GenServer.call(server_name(tournament.id), {:update, tournament}) - catch - :exit, reason -> - Logger.error("Error to send tournament update: #{inspect(reason)}") - {:error, :not_found} - end + GenServer.call(server_name(tournament.id), {:update, tournament}) + catch + :exit, reason -> + Logger.error("Error to send tournament update: #{inspect(reason)}") + {:error, :not_found} end @spec finish_round_after(tournament_id, non_neg_integer(), pos_integer()) :: :ok | {:error, :not_found} def finish_round_after(tournament_id, round_position, timeout_in_seconds) do - try do - GenServer.call( - server_name(tournament_id), - {:finish_round_after, round_position, timeout_in_seconds} - ) - catch - :exit, reason -> - Logger.error("Error to send tournament update: #{inspect(reason)}") - {:error, :not_found} - end + GenServer.call( + server_name(tournament_id), + {:finish_round_after, round_position, timeout_in_seconds} + ) + catch + :exit, reason -> + Logger.error("Error to send tournament update: #{inspect(reason)}") + {:error, :not_found} end @spec stop_round_break_after(tournament_id, non_neg_integer(), pos_integer()) :: :ok | {:error, :not_found} def stop_round_break_after(tournament_id, round_position, timeout_in_seconds) do - try do - GenServer.call( - server_name(tournament_id), - {:stop_round_break_after, round_position, timeout_in_seconds} - ) - catch - :exit, reason -> - Logger.error("Error to send tournament update: #{inspect(reason)}") - {:error, :not_found} - end + GenServer.call( + server_name(tournament_id), + {:stop_round_break_after, round_position, timeout_in_seconds} + ) + catch + :exit, reason -> + Logger.error("Error to send tournament update: #{inspect(reason)}") + {:error, :not_found} end def handle_event(tournament_id, event_type, params) do - try do - GenServer.call(server_name(tournament_id), {:fire_event, event_type, params}) - catch - :exit, reason -> - Logger.error("Error to send tournament update: #{inspect(reason)}") - {:error, :not_found} - end + GenServer.call(server_name(tournament_id), {:fire_event, event_type, params}) + catch + :exit, reason -> + Logger.error("Error to send tournament update: #{inspect(reason)}") + {:error, :not_found} end # SERVER @@ -156,7 +146,7 @@ defmodule Codebattle.Tournament.Server do Process.send_after( self(), {:finish_round_force, round_position}, - :timer.seconds(timeout_in_seconds) + to_timeout(second: timeout_in_seconds) ) {:reply, :ok, state} @@ -166,7 +156,7 @@ defmodule Codebattle.Tournament.Server do Process.send_after( self(), {:stop_round_break, round_position}, - :timer.seconds(timeout_in_seconds) + to_timeout(second: timeout_in_seconds) ) {:reply, :ok, state} @@ -178,8 +168,7 @@ defmodule Codebattle.Tournament.Server do def handle_call(:get_tournament_info, _from, state) do {:reply, - state.tournament - |> Map.drop([ + Map.drop(state.tournament, [ :__struct__, :__meta__, :creator, @@ -193,7 +182,7 @@ defmodule Codebattle.Tournament.Server do ]), state} end - def handle_call({:fire_event, event_type, params}, _from, state = %{tournament: tournament}) do + def handle_call({:fire_event, event_type, params}, _from, %{tournament: tournament} = state) do %{module: module} = tournament new_tournament = @@ -206,7 +195,7 @@ defmodule Codebattle.Tournament.Server do # TODO: rethink broadcasting during applying event, maybe put inside tournament module broadcast_tournament_event_by_type(event_type, params, new_tournament) - {:reply, tournament, Map.merge(state, %{tournament: new_tournament})} + {:reply, tournament, Map.put(state, :tournament, new_tournament)} end def handle_info({:stop_round_break, round_position}, %{tournament: tournament}) do @@ -233,14 +222,9 @@ defmodule Codebattle.Tournament.Server do end end - def handle_info( - %{ - topic: "game:tournament:" <> _t_id, - event: "game:tournament:finished", - payload: payload - }, - %{tournament: tournament} - ) do + def handle_info(%{topic: "game:tournament:" <> _t_id, event: "game:tournament:finished", payload: payload}, %{ + tournament: tournament + }) do match = get_match(tournament, payload.ref) if tournament.current_round_position == match.round_position and @@ -306,18 +290,9 @@ defmodule Codebattle.Tournament.Server do # {:noreply, %{tournament: new_tournament}} # end - def handle_info( - :match_waiting_room_players, - %{ - tournament: - tournament = - %Tournament{ - waiting_room_state: %WaitingRoom.State{ - state: "active" - } - } - } - ) do + def handle_info(:match_waiting_room_players, %{ + tournament: %Tournament{waiting_room_state: %WaitingRoom.State{state: "active"}} = tournament + }) do players = tournament |> Tournament.Players.get_players("matchmaking_active") @@ -352,18 +327,9 @@ defmodule Codebattle.Tournament.Server do {:noreply, %{tournament: new_tournament}} end - def handle_info( - :match_waiting_room_players, - %{ - tournament: - tournament = - %Tournament{ - waiting_room_state: %WaitingRoom.State{ - state: "paused" - } - } - } - ) do + def handle_info(:match_waiting_room_players, %{ + tournament: %Tournament{waiting_room_state: %WaitingRoom.State{state: "paused"}} = tournament + }) do Process.send_after(self(), :match_waiting_room_players, @waiting_room_timeout_ms) {:noreply, %{tournament: tournament}} end @@ -416,9 +382,7 @@ defmodule Codebattle.Tournament.Server do # TODO: updated end - defp maybe_preload_event_ranking( - tournament = %{use_clan: true, use_event_ranking: true, event_id: event_id} - ) + defp maybe_preload_event_ranking(%{use_clan: true, use_event_ranking: true, event_id: event_id} = tournament) when not is_nil(event_id) do new_tournament = Tournament.Ranking.preload_event_ranking(tournament) @@ -431,7 +395,7 @@ defmodule Codebattle.Tournament.Server do new_tournament end - defp maybe_preload_event_ranking(tournament = %{use_event_ranking: true, event_id: event_id}) + defp maybe_preload_event_ranking(%{use_event_ranking: true, event_id: event_id} = tournament) when not is_nil(event_id) do Tournament.Ranking.preload_event_ranking(tournament) end diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/storage/clans.ex b/services/app/apps/codebattle/lib/codebattle/tournament/storage/clans.ex index b24632f9c..4fb153092 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/storage/clans.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/storage/clans.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Storage.Clans do + @moduledoc false def create_table(id) do :ets.new( :"t_#{id}_clans", @@ -20,7 +21,7 @@ defmodule Codebattle.Tournament.Storage.Clans do end def get_all(tournament) do - tournament.clans_table |> :ets.tab2list() |> Enum.into(%{}) + tournament.clans_table |> :ets.tab2list() |> Map.new() end def get_clan(tournament, clan_id) do diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/storage/matches.ex b/services/app/apps/codebattle/lib/codebattle/tournament/storage/matches.ex index 78c89bbf4..ead0a0836 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/storage/matches.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/storage/matches.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Matches do + @moduledoc false def create_table(id) do :ets.new( :"t_#{id}_matches", diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/storage/players.ex b/services/app/apps/codebattle/lib/codebattle/tournament/storage/players.ex index f8b017f4e..4e150242e 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/storage/players.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/storage/players.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Players do + @moduledoc false def create_table(id) do :ets.new( :"t_#{id}_players", diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/storage/ranking.ex b/services/app/apps/codebattle/lib/codebattle/tournament/storage/ranking.ex index bb8bab13c..e7099a3ea 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/storage/ranking.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/storage/ranking.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Storage.Ranking do + @moduledoc false def create_table(id) do :ets.new( :"t_#{id}_ranking", diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/storage/tasks.ex b/services/app/apps/codebattle/lib/codebattle/tournament/storage/tasks.ex index 94db44594..627da0ea9 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/storage/tasks.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/storage/tasks.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Tasks do + @moduledoc false def create_table(id) do :ets.new( :"t_#{id}_tasks", diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/arena.ex b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/arena.ex index f48093cbe..112354eb8 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/arena.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/arena.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Arena do + @moduledoc false use Codebattle.Tournament.Base alias Codebattle.Tournament @@ -22,16 +23,12 @@ defmodule Codebattle.Tournament.Arena do def build_round_pairs(tournament) do {player_pair_ids, unmatched_player_ids} = build_player_pairs(tournament) - played_pair_ids = - player_pair_ids - |> Enum.map(&Enum.sort/1) - |> MapSet.new() + played_pair_ids = MapSet.new(player_pair_ids, &Enum.sort/1) - opponent_bot = Bot.Context.build() |> Tournament.Player.new!() + opponent_bot = Tournament.Player.new!(Bot.Context.build()) unmatched = - unmatched_player_ids - |> Enum.map(fn id -> + Enum.map(unmatched_player_ids, fn id -> [get_player(tournament, id), opponent_bot] end) @@ -97,14 +94,14 @@ defmodule Codebattle.Tournament.Arena do tournament end - defp build_player_pairs(tournament = %{use_clan: true, current_round_position: 0}) do + defp build_player_pairs(%{use_clan: true, current_round_position: 0} = tournament) do tournament |> get_players() |> Enum.map(&{&1.id, &1.clan_id}) |> Tournament.PairBuilder.ByClan.call() end - defp build_player_pairs(tournament = %{use_clan: true}) do + defp build_player_pairs(%{use_clan: true} = tournament) do tournament |> get_players() |> Enum.map(&{&1.id, &1.clan_id, &1.score}) diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/base.ex b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/base.ex index 1fa9ae757..72e8548aa 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/base.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/base.ex @@ -1,14 +1,13 @@ defmodule Codebattle.Tournament.Base do # credo:disable-for-this-file Credo.Check.Refactor.LongQuoteBlocks - + @moduledoc """ + Defines interface for tournament type + """ alias Codebattle.Event alias Codebattle.Game alias Codebattle.Tournament alias Codebattle.WaitingRoom - @moduledoc """ - Defines interface for tournament type - """ @callback build_round_pairs(Tournament.t()) :: {Tournament.t(), list(list(pos_integer()))} @callback calculate_round_results(Tournament.t()) :: Tournament.t() @callback complete_players(Tournament.t()) :: Tournament.t() @@ -23,12 +22,13 @@ defmodule Codebattle.Tournament.Base do quote location: :keep do @behaviour Tournament.Base + import Tournament.Helpers + import Tournament.TaskProvider + alias Codebattle.Bot alias Codebattle.Tournament.Score alias Codebattle.WaitingRoom - - import Tournament.Helpers - import Tournament.TaskProvider + alias Tournament.Round.Context require Logger @@ -49,12 +49,12 @@ defmodule Codebattle.Tournament.Base do Enum.reduce(users, tournament, &add_player(&2, &1)) end - def join(tournament = %{state: "waiting_participants"}, params = %{users: users}) do - player_params = Map.drop(params, [:users]) + def join(%{state: "waiting_participants"} = tournament, %{users: users} = params) do + player_params = Map.delete(params, :users) Enum.reduce(users, tournament, &join(&2, Map.put(player_params, :user, &1))) end - def join(tournament = %{state: "waiting_participants"}, params) do + def join(%{state: "waiting_participants"} = tournament, params) do player = params.user |> Map.put(:lang, params.user.lang || tournament.default_language) @@ -67,7 +67,7 @@ defmodule Codebattle.Tournament.Base do end end - def join(tournament = %{state: "active", type: "arena"}, params) do + def join(%{state: "active", type: "arena"} = tournament, params) do player = params.user |> Map.put(:lang, params.user.lang || tournament.default_language) @@ -246,8 +246,7 @@ defmodule Codebattle.Tournament.Base do if can_moderate?(tournament, user) do Tournament.Round.disable_all_rounds(tournament.id) - tournament - |> update_struct(%{ + update_struct(tournament, %{ players: %{}, meta: reset_meta(tournament.meta), matches: %{}, @@ -260,7 +259,7 @@ defmodule Codebattle.Tournament.Base do last_round_started_at: nil, winner_ids: [], top_player_ids: [], - starts_at: DateTime.utc_now(:second) |> DateTime.add(5 * 60, :second), + starts_at: :second |> DateTime.utc_now() |> DateTime.add(5 * 60, :second), state: "waiting_participants" }) else @@ -270,7 +269,7 @@ defmodule Codebattle.Tournament.Base do def restart(tournament, _user), do: tournament - def start(tournament = %{state: "waiting_participants"}, params = %{user: user}) do + def start(%{state: "waiting_participants"} = tournament, %{user: user} = params) do if can_moderate?(tournament, user) do tournament = complete_players(tournament) @@ -290,7 +289,7 @@ defmodule Codebattle.Tournament.Base do def start(tournament, _params), do: tournament - defp maybe_init_waiting_room(t = %{waiting_room_name: nil}, _params), do: t + defp maybe_init_waiting_room(%{waiting_room_name: nil} = t, _params), do: t defp maybe_init_waiting_room(tournament, params) do state = @@ -307,11 +306,7 @@ defmodule Codebattle.Tournament.Base do def start_round_force(tournament, params \\ %{}) - def start_round_force( - tournament = %{state: "finished"}, - _new_round_params - ), - do: tournament + def start_round_force(%{state: "finished"} = tournament, _new_round_params), do: tournament def start_round_force(tournament, new_round_params) do tournament @@ -401,9 +396,7 @@ defmodule Codebattle.Tournament.Base do tournament end - def remove_pass_code(tournament = %{meta: %{game_passwords: passwords}}, %{ - pass_code: pass_code - }) do + def remove_pass_code(%{meta: %{game_passwords: passwords}} = tournament, %{pass_code: pass_code}) do if pass_code in passwords do update_in(tournament.meta.game_passwords, fn codes -> List.delete(codes, pass_code) @@ -488,25 +481,22 @@ defmodule Codebattle.Tournament.Base do Enum.find(player_ids, &(player_results[&1] && player_results[&1].result == "won")) end - defp maybe_start_round_or_break_or_finish(tournament = %{state: "finished"}) do + defp maybe_start_round_or_break_or_finish(%{state: "finished"} = tournament) do tournament end - defp maybe_start_round_or_break_or_finish(tournament = %{use_infinite_break: true}) do + defp maybe_start_round_or_break_or_finish(%{use_infinite_break: true} = tournament) do update_struct(tournament, %{break_state: "on"}) end defp maybe_start_round_or_break_or_finish( - tournament = %{ - state: "active", - break_duration_seconds: break_duration_seconds - } + %{state: "active", break_duration_seconds: break_duration_seconds} = tournament ) when break_duration_seconds not in [nil, 0] do Process.send_after( self(), {:stop_round_break, tournament.current_round_position}, - :timer.seconds(tournament.break_duration_seconds) + to_timeout(second: tournament.break_duration_seconds) ) update_struct(tournament, %{break_state: "on"}) @@ -527,8 +517,7 @@ defmodule Codebattle.Tournament.Base do |> update_struct(%{ break_state: "off", last_round_started_at: NaiveDateTime.utc_now(:second), - match_timeout_seconds: - Map.get(round_params, :timeout_seconds, tournament.match_timeout_seconds) + match_timeout_seconds: Map.get(round_params, :timeout_seconds, tournament.match_timeout_seconds) }) |> build_and_save_round!() |> maybe_preload_tasks() @@ -541,7 +530,7 @@ defmodule Codebattle.Tournament.Base do |> broadcast_round_created() end - defp maybe_start_waiting_room(tournament = %{waiting_room_name: nil}) do + defp maybe_start_waiting_room(%{waiting_room_name: nil} = tournament) do tournament end @@ -555,21 +544,19 @@ defmodule Codebattle.Tournament.Base do } end - defp maybe_set_round_task_ids( - tournament = %{task_provider: "task_pack", current_round_position: 0} - ) do + defp maybe_set_round_task_ids(%{task_provider: "task_pack", current_round_position: 0} = tournament) do update_struct(tournament, %{ round_task_ids: get_round_task_ids(tournament, 0) }) end - defp maybe_set_round_task_ids(tournament = %{task_provider: "task_pack_per_round"}) do + defp maybe_set_round_task_ids(%{task_provider: "task_pack_per_round"} = tournament) do update_struct(tournament, %{ round_task_ids: get_round_task_ids(tournament, tournament.current_round_position) }) end - defp maybe_set_round_task_ids(tournament = %{current_round_position: 0}) do + defp maybe_set_round_task_ids(%{current_round_position: 0} = tournament) do update_struct(tournament, %{round_task_ids: get_all_task_ids(tournament)}) end @@ -607,7 +594,7 @@ defmodule Codebattle.Tournament.Base do # player_ids: Enum.sort([p1.id, p2.id]) # }) - {players = [p1, p2], match_id} -> + {[p1, p2] = players, match_id} -> %{ players: players, ref: match_id, @@ -681,8 +668,7 @@ defmodule Codebattle.Tournament.Base do Tournament.Players.put_player(tournament, %{ player | matches_ids: [match.id | player.matches_ids], - task_ids: - if(reset_task_ids, do: [game.task_id], else: [game.task_id | player.task_ids]) + task_ids: if(reset_task_ids, do: [game.task_id], else: [game.task_id | player.task_ids]) }) end) @@ -701,8 +687,8 @@ defmodule Codebattle.Tournament.Base do def build_and_save_round!(tournament) do round = tournament - |> Tournament.Round.Context.build() - |> Tournament.Round.Context.upsert!() + |> Context.build() + |> Context.upsert!() update_struct(tournament, %{ current_round_id: round.id @@ -736,7 +722,7 @@ defmodule Codebattle.Tournament.Base do [id] -> player = get_player(tournament, id) - opponent_bot = Bot.Context.build() |> Tournament.Player.new!() + opponent_bot = Tournament.Player.new!(Bot.Context.build()) {[player, opponent_bot], get_rematch_task(tournament, player.task_ids)} end) |> Enum.split_with(fn {player, task_id} -> is_nil(task_id) end) @@ -780,7 +766,7 @@ defmodule Codebattle.Tournament.Base do |> db_save!(:with_ets) |> broadcast_tournament_finished() |> then(fn tournament -> - Process.send_after(self(), :terminate, :timer.minutes(15)) + Process.send_after(self(), :terminate, to_timeout(minute: 15)) tournament end) @@ -789,9 +775,7 @@ defmodule Codebattle.Tournament.Base do end end - defp update_players_state_after_round_finished( - tournament = %{type: "arena", state: "finished"} - ) do + defp update_players_state_after_round_finished(%{type: "arena", state: "finished"} = tournament) do tournament |> get_players() |> Enum.each(fn player -> @@ -810,7 +794,7 @@ defmodule Codebattle.Tournament.Base do tournament end - defp update_players_state_after_round_finished(tournament = %{type: "arena"}) do + defp update_players_state_after_round_finished(%{type: "arena"} = tournament) do tournament |> get_players() |> Enum.each(fn player -> @@ -839,13 +823,13 @@ defmodule Codebattle.Tournament.Base do update_struct(tournament, %{winner_ids: get_winner_ids(tournament)}) end - defp maybe_start_round_timer(tournament = %{round_timeout_seconds: nil}), do: tournament + defp maybe_start_round_timer(%{round_timeout_seconds: nil} = tournament), do: tournament defp maybe_start_round_timer(tournament) do Process.send_after( self(), {:finish_round_force, tournament.current_round_position}, - :timer.seconds(tournament.round_timeout_seconds) + to_timeout(second: tournament.round_timeout_seconds) ) tournament @@ -899,7 +883,7 @@ defmodule Codebattle.Tournament.Base do Codebattle.PubSub.broadcast("tournament:updated", %{tournament: tournament}) end - defp maybe_preload_tasks(tournament = %{current_round_position: 0}) do + defp maybe_preload_tasks(%{current_round_position: 0} = tournament) do Tournament.Tasks.put_tasks(tournament, get_all_tasks(tournament)) tournament @@ -974,7 +958,7 @@ defmodule Codebattle.Tournament.Base do defp improve_player_results(tournament, match, duration_sec) do case Game.Context.fetch_game(match.game_id) do - {:ok, game = %{is_live: true}} -> + {:ok, %{is_live: true} = game} -> game |> Game.Helpers.get_player_results() |> Map.new(fn {player_id, result} -> @@ -1016,11 +1000,7 @@ defmodule Codebattle.Tournament.Base do end end - defp maybe_set_free_task( - game_params, - tournament = %Tournament{type: "show", task_strategy: "sequential"}, - player - ) do + defp maybe_set_free_task(game_params, %Tournament{type: "show", task_strategy: "sequential"} = tournament, player) do task_id = Enum.at(tournament.round_task_ids, Enum.count(player.task_ids)) Map.put(game_params, :task_id, task_id) @@ -1031,24 +1011,22 @@ defmodule Codebattle.Tournament.Base do game_params end - defp maybe_save_event_results(tournament = %{use_clan: true, event_id: event_id}) - when not is_nil(event_id) do + defp maybe_save_event_results(%{use_clan: true, event_id: event_id} = tournament) when not is_nil(event_id) do Event.EventClanResult.save_results(tournament) Event.EventResult.save_results(tournament) tournament end - defp maybe_save_event_results(tournament = %{event_id: event_id}) - when not is_nil(event_id) do + defp maybe_save_event_results(%{event_id: event_id} = tournament) when not is_nil(event_id) do Event.EventResult.save_results(tournament) tournament end defp maybe_save_event_results(t), do: t - defp maybe_activate_players(t = %{current_round_position: 0}), do: t + defp maybe_activate_players(%{current_round_position: 0} = t), do: t - defp maybe_activate_players(tournament = %{type: "arena"}) do + defp maybe_activate_players(%{type: "arena"} = tournament) do tournament |> get_players() |> Enum.each(fn player -> @@ -1062,7 +1040,7 @@ defmodule Codebattle.Tournament.Base do defp maybe_activate_players(t), do: t - defp maybe_pause_waiting_room(t = %{waiting_room_name: nil}), do: t + defp maybe_pause_waiting_room(%{waiting_room_name: nil} = t), do: t defp maybe_pause_waiting_room(tournament) do %{ @@ -1074,7 +1052,7 @@ defmodule Codebattle.Tournament.Base do } end - defp maybe_finish_waiting_room(t = %{waiting_room_name: nil}), do: t + defp maybe_finish_waiting_room(%{waiting_room_name: nil} = t), do: t defp maybe_finish_waiting_room(tournament) do %{ diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/individual.ex b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/individual.ex index 87e082dc1..2f935a42c 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/individual.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/individual.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Individual do + @moduledoc false use Codebattle.Tournament.Base alias Codebattle.Bot @@ -32,10 +33,10 @@ defmodule Codebattle.Tournament.Individual do def set_ranking(t), do: t @impl Tournament.Base - def build_round_pairs(tournament = %{current_round_position: 0}) do + def build_round_pairs(%{current_round_position: 0} = tournament) do player_pairs = tournament - |> get_players + |> get_players() |> Enum.shuffle() |> Enum.chunk_every(2) diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/show.ex b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/show.ex index dcd3ef2e1..d14278e05 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/show.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/show.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Show do + @moduledoc false use Codebattle.Tournament.Base alias Codebattle.Tournament @@ -22,7 +23,7 @@ defmodule Codebattle.Tournament.Show do def build_round_pairs(tournament) do player_pairs = tournament - |> get_players + |> get_players() |> Enum.shuffle() |> Enum.chunk_every(2) diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/squad.ex b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/squad.ex index baeec65f1..2ab52453c 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/squad.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/squad.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Squad do + @moduledoc false use Codebattle.Tournament.Base alias Codebattle.Tournament @@ -53,11 +54,11 @@ defmodule Codebattle.Tournament.Squad do @impl Tournament.Base def finish_round_after_match?( - tournament = %{ + %{ task_provider: "task_pack_per_round", round_task_ids: round_task_ids, current_round_position: current_round_position - } + } = tournament ) do matches = get_round_matches(tournament, current_round_position) diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/swiss.ex b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/swiss.ex index ee0048479..3a64de3bb 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/swiss.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/swiss.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Swiss do + @moduledoc false use Codebattle.Tournament.Base alias Codebattle.Bot @@ -55,11 +56,10 @@ defmodule Codebattle.Tournament.Swiss do |> Enum.map(&{&1.id, &1.score}) |> Tournament.PairBuilder.ByScore.call() - opponent_bot = Bot.Context.build() |> Tournament.Player.new!() + opponent_bot = Tournament.Player.new!(Bot.Context.build()) unmatched = - unmatched_player_ids - |> Enum.map(fn id -> + Enum.map(unmatched_player_ids, fn id -> [get_player(tournament, id), opponent_bot] end) @@ -132,15 +132,15 @@ defmodule Codebattle.Tournament.Swiss do end def build_new_pairs([p1, p2], player_pairs, played_pair_ids) do - pair_ids = [p1.id, p2.id] |> Enum.sort() + pair_ids = Enum.sort([p1.id, p2.id]) {[[p1, p2] | player_pairs], MapSet.put(played_pair_ids, pair_ids)} end def build_new_pairs([player | remain_players], player_pairs, played_pair_ids) do {player_pair, pair_ids, remain_players} = - Enum.reduce_while( - remain_players, + remain_players + |> Enum.reduce_while( {player, remain_players, played_pair_ids}, fn candidate, _acc -> pair_ids = Enum.sort([player.id, candidate.id]) @@ -148,8 +148,7 @@ defmodule Codebattle.Tournament.Swiss do if MapSet.member?(played_pair_ids, pair_ids) do {:cont, {player, remain_players, played_pair_ids}} else - {:halt, - {:new, [player, candidate], pair_ids, drop_player(remain_players, candidate.id)}} + {:halt, {:new, [player, candidate], pair_ids, drop_player(remain_players, candidate.id)}} end end ) diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/team.ex b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/team.ex index 60b3e0d31..52b52c098 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/team.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/team.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Team do + @moduledoc false use Codebattle.Tournament.Base alias Codebattle.Bot @@ -34,7 +35,7 @@ defmodule Codebattle.Tournament.Team do @impl Tournament.Base def reset_meta(meta) do - new_teams = Enum.map(meta.teams, fn {id, team} -> {id, Map.merge(team, score: 0.0)} end) + new_teams = Enum.map(meta.teams, fn {id, team} -> {id, Map.put(team, :score, 0.0)} end) Map.merge(meta, %{round_results: %{}, teams: new_teams}) end diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/versus.ex b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/versus.ex index d7f552f27..87fd3a5b7 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/strategy/versus.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/strategy/versus.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Versus do + @moduledoc false use Codebattle.Tournament.Base alias Codebattle.Bot diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/supervisor.ex b/services/app/apps/codebattle/lib/codebattle/tournament/supervisor.ex index 435b28b3c..620220126 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/supervisor.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/supervisor.ex @@ -1,4 +1,5 @@ defmodule Codebattle.Tournament.Supervisor do + @moduledoc false use Supervisor require Logger @@ -28,9 +29,7 @@ defmodule Codebattle.Tournament.Supervisor do %{ id: "Codebattle.Tournament.Ranking.UpdateFromResultsServer.#{tournament.id}", restart: :transient, - start: - {Codebattle.Tournament.Ranking.UpdateFromResultsServer, :start_link, - [tournament.id]} + start: {Codebattle.Tournament.Ranking.UpdateFromResultsServer, :start_link, [tournament.id]} } ] else diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/task_provider.ex b/services/app/apps/codebattle/lib/codebattle/tournament/task_provider.ex index 0027655b9..4d5900480 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/task_provider.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/task_provider.ex @@ -1,22 +1,21 @@ defmodule Codebattle.Tournament.TaskProvider do + @moduledoc false alias Codebattle.TaskPack alias Codebattle.Tournament.Tasks def get_all_tasks(%{task_provider: "all"}) do - Codebattle.Task.get_all_visible() |> Enum.shuffle() + Enum.shuffle(Codebattle.Task.get_all_visible()) end def get_all_tasks(%{task_provider: "level", level: level}) do level |> Codebattle.Task.get_tasks_by_level() |> Enum.shuffle() end - def get_all_tasks(%{task_provider: "task_pack", task_pack_name: tp_name}) - when not is_nil(tp_name) do + def get_all_tasks(%{task_provider: "task_pack", task_pack_name: tp_name}) when not is_nil(tp_name) do TaskPack.get_tasks_by_pack_name(tp_name) end - def get_all_tasks(%{task_provider: "task_pack_per_round", task_pack_name: tp_name}) - when not is_nil(tp_name) do + def get_all_tasks(%{task_provider: "task_pack_per_round", task_pack_name: tp_name}) when not is_nil(tp_name) do tp_name |> get_task_pack_names() |> Enum.map(&TaskPack.get_tasks_by_pack_name/1) @@ -24,14 +23,7 @@ defmodule Codebattle.Tournament.TaskProvider do |> Map.new() end - def get_round_task_ids( - %{ - task_provider: "task_pack", - task_strategy: "sequential", - task_pack_name: tp_name - }, - _round - ) + def get_round_task_ids(%{task_provider: "task_pack", task_strategy: "sequential", task_pack_name: tp_name}, _round) when not is_nil(tp_name) do [name: tp_name] |> TaskPack.get_by!() @@ -39,11 +31,7 @@ defmodule Codebattle.Tournament.TaskProvider do end def get_round_task_ids( - %{ - task_provider: "task_pack_per_round", - task_strategy: "sequential", - task_pack_name: tp_name - }, + %{task_provider: "task_pack_per_round", task_strategy: "sequential", task_pack_name: tp_name}, round ) when not is_nil(tp_name) do @@ -76,15 +64,15 @@ defmodule Codebattle.Tournament.TaskProvider do def get_common_round_task_id(%{task_strategy: "random_per_game"}, _params), do: nil - def get_common_round_task_id(tournament = %{task_strategy: "random_per_round"}, _params) do + def get_common_round_task_id(%{task_strategy: "random_per_round"} = tournament, _params) do safe_random(tournament.round_task_ids) end - def get_common_round_task_id(tournament = %{task_strategy: "sequential"}, _params) do + def get_common_round_task_id(%{task_strategy: "sequential"} = tournament, _params) do Enum.at(tournament.round_task_ids, 0) end - def get_rematch_task(tournament = %{task_strategy: "sequential"}, completed_task_ids) do + def get_rematch_task(%{task_strategy: "sequential"} = tournament, completed_task_ids) do tournament.round_task_ids |> Enum.at(completed_task_ids |> Enum.uniq() |> Enum.count()) |> case do @@ -102,7 +90,7 @@ defmodule Codebattle.Tournament.TaskProvider do end end - def get_task(tournament = %{task_strategy: "sequential"}, nil) do + def get_task(%{task_strategy: "sequential"} = tournament, nil) do tournament.round_task_ids |> List.first() |> case do diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/tournament.ex b/services/app/apps/codebattle/lib/codebattle/tournament/tournament.ex index 14c4706d5..a2c7eceaf 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/tournament.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/tournament.ex @@ -2,11 +2,12 @@ defmodule Codebattle.Tournament do @moduledoc false use Ecto.Schema + import Ecto.Changeset - alias Runner.AtomizedMap alias Codebattle.Event alias Codebattle.Tournament.Individual + alias Runner.AtomizedMap @type t :: %__MODULE__{} diff --git a/services/app/apps/codebattle/lib/codebattle/tournament/tournament_result.ex b/services/app/apps/codebattle/lib/codebattle/tournament/tournament_result.ex index d699c8477..8505ee0a9 100644 --- a/services/app/apps/codebattle/lib/codebattle/tournament/tournament_result.ex +++ b/services/app/apps/codebattle/lib/codebattle/tournament/tournament_result.ex @@ -1,14 +1,15 @@ defmodule Codebattle.Tournament.TournamentResult do @moduledoc false + use Ecto.Schema + + import Ecto.Query + alias Codebattle.Clan alias Codebattle.Repo alias Codebattle.Tournament alias Codebattle.Tournament.Score.WinLoss - use Ecto.Schema - import Ecto.Query - @type t :: %__MODULE__{} schema "tournament_results" do @@ -52,7 +53,7 @@ defmodule Codebattle.Tournament.TournamentResult do """ @spec upsert_results(tounament :: Tournament.t() | map()) :: Tournament.t() - def upsert_results(tournament = %{type: "arena", ranking_type: "by_player_95th_percentile"}) do + def upsert_results(%{type: "arena", ranking_type: "by_player_95th_percentile"} = tournament) do clean_results(tournament.id) Repo.query!(""" @@ -139,7 +140,7 @@ defmodule Codebattle.Tournament.TournamentResult do tournament end - def upsert_results(tournament = %{type: "arena", score_strategy: "win_loss"}) do + def upsert_results(%{type: "arena", score_strategy: "win_loss"} = tournament) do clean_results(tournament.id) Repo.query!(""" @@ -489,7 +490,7 @@ defmodule Codebattle.Tournament.TournamentResult do columns = Enum.map(result.columns, &String.to_atom/1) Enum.map(result.rows, fn row -> - Enum.zip(columns, row) |> Enum.into(%{}) + columns |> Enum.zip(row) |> Map.new() end) end end diff --git a/services/app/apps/codebattle/lib/codebattle/user.ex b/services/app/apps/codebattle/lib/codebattle/user.ex index 54bca8aba..3c7cb05b0 100644 --- a/services/app/apps/codebattle/lib/codebattle/user.ex +++ b/services/app/apps/codebattle/lib/codebattle/user.ex @@ -8,8 +8,8 @@ defmodule Codebattle.User do import Ecto.Changeset import Ecto.Query - alias Codebattle.Repo alias Codebattle.Clan + alias Codebattle.Repo alias Codebattle.User.SoundSettings @type t :: %__MODULE__{} @@ -148,7 +148,7 @@ defmodule Codebattle.User do def bot?(user_id) when is_integer(user_id), do: user_id < 0 @spec guest_id() :: integer() - def guest_id(), do: @guest_id + def guest_id, do: @guest_id @spec get!(raw_id()) :: t() | no_return() def get!(user_id) do @@ -215,8 +215,6 @@ defmodule Codebattle.User do defp verify_password(user, password) do if Bcrypt.verify_pass(password, user.password_hash) do user - else - nil end end @@ -229,8 +227,7 @@ defmodule Codebattle.User do def create_password_hash(user, password) do hashed_password = Bcrypt.hash_pwd_salt(password) - from(u in __MODULE__, where: u.id == ^user.id) - |> Repo.update_all(set: [password_hash: hashed_password]) + Repo.update_all(from(u in __MODULE__, where: u.id == ^user.id), set: [password_hash: hashed_password]) end def subscription_types, do: @subscription_types @@ -241,11 +238,9 @@ defmodule Codebattle.User do # nil for new token users, clan will be managed by admin defp assign_clan(changeset, params, nil), do: assign_clan(changeset, params, 1) - defp assign_clan(changeset, %{clan: clan_name}, user_id), - do: find_or_create_by_clan(changeset, clan_name, user_id) + defp assign_clan(changeset, %{clan: clan_name}, user_id), do: find_or_create_by_clan(changeset, clan_name, user_id) - defp assign_clan(changeset, %{"clan" => clan_name}, user_id), - do: find_or_create_by_clan(changeset, clan_name, user_id) + defp assign_clan(changeset, %{"clan" => clan_name}, user_id), do: find_or_create_by_clan(changeset, clan_name, user_id) defp assign_clan(changeset, _params, _user_id), do: changeset diff --git a/services/app/apps/codebattle/lib/codebattle/user/achievements.ex b/services/app/apps/codebattle/lib/codebattle/user/achievements.ex index e711e06ea..6530a104d 100644 --- a/services/app/apps/codebattle/lib/codebattle/user/achievements.ex +++ b/services/app/apps/codebattle/lib/codebattle/user/achievements.ex @@ -2,10 +2,11 @@ defmodule Codebattle.User.Achievements do @moduledoc """ Count user achievements """ - alias Codebattle.{Repo, UserGame} - import Ecto.Query, warn: false + alias Codebattle.Repo + alias Codebattle.UserGame + def recalculate_achievements(user) do {user.achievements, user} |> count_played_games() @@ -14,9 +15,7 @@ defmodule Codebattle.User.Achievements do end def count_played_games({achievements, user}) do - user_games_count = - from(ug in UserGame, select: ug.result, where: ug.user_id == ^user.id) - |> Repo.aggregate(:count, :id) + user_games_count = Repo.aggregate(from(ug in UserGame, select: ug.result, where: ug.user_id == ^user.id), :count, :id) filtered_achievements = Enum.filter(achievements, &(!Regex.match?(~r/played_.+_games/, &1))) @@ -62,19 +61,19 @@ defmodule Codebattle.User.Achievements do group_by: ug.lang ) - languages = Repo.all(query) |> Enum.into(%{}) |> Map.keys() + languages = query |> Repo.all() |> Map.new() |> Map.keys() exist_achievement = - Enum.filter(achievements, fn x -> String.contains?(x, "win_games_with") end) |> Enum.at(0) + achievements |> Enum.filter(fn x -> String.contains?(x, "win_games_with") end) |> Enum.at(0) new_achievement = "win_games_with?#{Enum.join(languages, "_")}" if Enum.count(languages) >= 3 do - if new_achievement !== exist_achievement do + if new_achievement === exist_achievement do + {achievements, user} + else new_list = List.delete(achievements, exist_achievement) {new_list ++ [new_achievement], user} - else - {achievements, user} end else {achievements, user} diff --git a/services/app/apps/codebattle/lib/codebattle/user/scope.ex b/services/app/apps/codebattle/lib/codebattle/user/scope.ex index 928ea35e8..4de047cfe 100644 --- a/services/app/apps/codebattle/lib/codebattle/user/scope.ex +++ b/services/app/apps/codebattle/lib/codebattle/user/scope.ex @@ -3,16 +3,17 @@ defmodule Codebattle.User.Scope do Module with scopes for the User scheme """ - alias Codebattle.User - import Ecto.Query + alias Codebattle.User + def by_email_or_name(query, %{name: name, email: email}) do from(u in query, where: u.name == ^name or u.email == ^email) end def list_users(params) do - base_query(params) + params + |> base_query() |> filter_by_date(params) |> search_by_name(params) |> without_bots(params) @@ -37,7 +38,7 @@ defmodule Codebattle.User.Scope do end defp filter_by_date(query, %{"date_from" => date_from}) when date_from !== "" do - starts_at = Date.from_iso8601!(date_from) |> NaiveDateTime.new!(~T[00:00:00]) + starts_at = date_from |> Date.from_iso8601!() |> NaiveDateTime.new!(~T[00:00:00]) query |> where([ug: ug], ug.inserted_at >= type(^starts_at, :naive_datetime)) @@ -48,8 +49,7 @@ defmodule Codebattle.User.Scope do defp search_by_name(query, %{"q" => %{"name_ilike" => ""}}), do: query - defp search_by_name(query, %{"q" => %{"name_ilike" => term}}) - when is_binary(term) do + defp search_by_name(query, %{"q" => %{"name_ilike" => term}}) when is_binary(term) do where(query, [u: u], ilike(u.name, ^"%#{term}%")) end diff --git a/services/app/apps/codebattle/lib/codebattle/user/sound_settings.ex b/services/app/apps/codebattle/lib/codebattle/user/sound_settings.ex index d2c758d70..e9d6919bd 100644 --- a/services/app/apps/codebattle/lib/codebattle/user/sound_settings.ex +++ b/services/app/apps/codebattle/lib/codebattle/user/sound_settings.ex @@ -1,7 +1,9 @@ defmodule Codebattle.User.SoundSettings do + @moduledoc false use Ecto.Schema import Ecto.Changeset + @primary_key false @types ~w(cs dendy standard silent) diff --git a/services/app/apps/codebattle/lib/codebattle/user/stats.ex b/services/app/apps/codebattle/lib/codebattle/user/stats.ex index 48c93b890..5a98179c7 100644 --- a/services/app/apps/codebattle/lib/codebattle/user/stats.ex +++ b/services/app/apps/codebattle/lib/codebattle/user/stats.ex @@ -3,22 +3,23 @@ defmodule Codebattle.User.Stats do Find user game statistic """ + import Ecto.Query + alias Codebattle.Repo alias Codebattle.UserGame - import Ecto.Query - @default_game_stats %{"won" => 0, "lost" => 0, "gave_up" => 0} def get_game_stats(user_id) do user_games_stats = - from(ug in UserGame, - select: %{result: ug.result, lang: ug.lang, count: count(ug.id)}, - where: ug.user_id == ^user_id, - where: ug.result in ["won", "lost", "gave_up"], - group_by: [ug.result, ug.lang] + Repo.all( + from(ug in UserGame, + select: %{result: ug.result, lang: ug.lang, count: count(ug.id)}, + where: ug.user_id == ^user_id, + where: ug.result in ["won", "lost", "gave_up"], + group_by: [ug.result, ug.lang] + ) ) - |> Repo.all() games_stats = user_games_stats diff --git a/services/app/apps/codebattle/lib/codebattle/user_game.ex b/services/app/apps/codebattle/lib/codebattle/user_game.ex index e599ee1d2..adb4487fe 100644 --- a/services/app/apps/codebattle/lib/codebattle/user_game.ex +++ b/services/app/apps/codebattle/lib/codebattle/user_game.ex @@ -2,7 +2,9 @@ defmodule Codebattle.UserGame do @moduledoc false use Ecto.Schema + import Ecto.Changeset + alias Codebattle.UserGame @results ~w(undefined won lost gave_up timeout) @@ -22,7 +24,7 @@ defmodule Codebattle.UserGame do end @doc false - def changeset(user_game = %UserGame{}, attrs) do + def changeset(%UserGame{} = user_game, attrs) do user_game |> cast(attrs, [ :user_id, diff --git a/services/app/apps/codebattle/lib/codebattle/user_game_report.ex b/services/app/apps/codebattle/lib/codebattle/user_game_report.ex index bb7a6572f..e6db31885 100644 --- a/services/app/apps/codebattle/lib/codebattle/user_game_report.ex +++ b/services/app/apps/codebattle/lib/codebattle/user_game_report.ex @@ -2,6 +2,7 @@ defmodule Codebattle.UserGameReport do @moduledoc false use Ecto.Schema + import Ecto.Changeset import Ecto.Query @@ -42,7 +43,7 @@ defmodule Codebattle.UserGameReport do timestamps() end - def changeset(struct = %__MODULE__{}, params \\ %{}) do + def changeset(%__MODULE__{} = struct, params \\ %{}) do struct |> cast(params, [ :comment, diff --git a/services/app/apps/codebattle/lib/codebattle/users_rank_update_server.ex b/services/app/apps/codebattle/lib/codebattle/users_rank_update_server.ex index c59975372..bea206215 100644 --- a/services/app/apps/codebattle/lib/codebattle/users_rank_update_server.ex +++ b/services/app/apps/codebattle/lib/codebattle/users_rank_update_server.ex @@ -5,14 +5,14 @@ defmodule Codebattle.UsersRankUpdateServer do require Logger - @timeout :timer.minutes(57) + @timeout to_timeout(minute: 57) # API def start_link(_) do GenServer.start_link(__MODULE__, [], name: __MODULE__) end - def update() do + def update do GenServer.cast(__MODULE__, :update) end diff --git a/services/app/apps/codebattle/lib/codebattle/utils/populate_users.ex b/services/app/apps/codebattle/lib/codebattle/utils/populate_users.ex index 848ec918d..963185621 100644 --- a/services/app/apps/codebattle/lib/codebattle/utils/populate_users.ex +++ b/services/app/apps/codebattle/lib/codebattle/utils/populate_users.ex @@ -2,13 +2,13 @@ defmodule Codebattle.Utils.PopulateUsers do @moduledoc false def from_csv(file) do - utc_now = NaiveDateTime.utc_now() |> NaiveDateTime.truncate(:second) + utc_now = NaiveDateTime.truncate(NaiveDateTime.utc_now(), :second) - File.stream!(file) + file + |> File.stream!() |> NimbleCSV.RFC4180.parse_stream() |> Stream.chunk_every(500) - |> Stream.each(&process_batch(&1, utc_now)) - |> Stream.run() + |> Enum.each(&process_batch(&1, utc_now)) end defp process_batch(users, now) do diff --git a/services/app/apps/codebattle/lib/codebattle/waiting_room/engine.ex b/services/app/apps/codebattle/lib/codebattle/waiting_room/engine.ex index bb2b78d56..9fb0e4dd9 100644 --- a/services/app/apps/codebattle/lib/codebattle/waiting_room/engine.ex +++ b/services/app/apps/codebattle/lib/codebattle/waiting_room/engine.ex @@ -1,12 +1,13 @@ defmodule Codebattle.WaitingRoom.Engine do + @moduledoc false alias Codebattle.WaitingRoom.State require Logger @spec call(State.t()) :: State.t() - def call(state = %State{players: []}), do: state + def call(%State{players: []} = state), do: state - def call(state = %State{}) do + def call(%State{} = state) do Logger.debug("WREngine match players " <> inspect(state.players)) state @@ -31,7 +32,7 @@ defmodule Codebattle.WaitingRoom.Engine do %{state | groups: groups, unmatched: unmatched} end - defp maybe_filter_score(state = %{use_score?: true}) do + defp maybe_filter_score(%{use_score?: true} = state) do %{state | groups: Enum.sort_by(state.groups, & &1.score, :desc)} end @@ -74,7 +75,7 @@ defmodule Codebattle.WaitingRoom.Engine do end) end - defp maybe_match_with_played(state = %{use_played_pairs?: false}) do + defp maybe_match_with_played(%{use_played_pairs?: false} = state) do state end @@ -98,7 +99,7 @@ defmodule Codebattle.WaitingRoom.Engine do } end - defp maybe_match_with_bots(state = %{use_match_with_bots?: false}) do + defp maybe_match_with_bots(%{use_match_with_bots?: false} = state) do state end @@ -127,17 +128,12 @@ defmodule Codebattle.WaitingRoom.Engine do {pairs, [player | unmatched]} end - defp match_group( - %{use_clan?: true}, - [p1 = %{clan_id: c1_id}, p2 = %{clan_id: c2_id}], - pairs, - unmatched - ) + defp match_group(%{use_clan?: true}, [%{clan_id: c1_id} = p1, %{clan_id: c2_id} = p2], pairs, unmatched) when c1_id == c2_id do {pairs, [p1, p2 | unmatched]} end - defp match_group(state = %{use_played_pairs?: true}, [p1, p2], pairs, unmatched) do + defp match_group(%{use_played_pairs?: true} = state, [p1, p2], pairs, unmatched) do pair = Enum.sort([p1.id, p2.id]) if MapSet.member?(state.played_pair_ids, pair) do @@ -152,8 +148,8 @@ defmodule Codebattle.WaitingRoom.Engine do end defp match_group(state, [p1 | remained_players], pairs, unmatched) do - Enum.reduce_while( - remained_players, + remained_players + |> Enum.reduce_while( nil, fn p2, _acc -> cond do diff --git a/services/app/apps/codebattle/lib/codebattle/waiting_room/server.ex b/services/app/apps/codebattle/lib/codebattle/waiting_room/server.ex index 25fb4ad59..54478bfb4 100644 --- a/services/app/apps/codebattle/lib/codebattle/waiting_room/server.ex +++ b/services/app/apps/codebattle/lib/codebattle/waiting_room/server.ex @@ -10,7 +10,7 @@ defmodule Codebattle.WaitingRoom.Server do require Logger - def start_link(params = %{name: name}) do + def start_link(%{name: name} = params) do GenServer.start_link(__MODULE__, [params], name: wr_name(name)) end @@ -24,8 +24,7 @@ defmodule Codebattle.WaitingRoom.Server do def pause(name), do: GenServer.call(wr_name(name), :pause) def update_state(name, params), do: GenServer.call(wr_name(name), {:update_state, params}) - def delete_player(name, player_id), - do: GenServer.cast(wr_name(name), {:delete_player, player_id}) + def delete_player(name, player_id), do: GenServer.cast(wr_name(name), {:delete_player, player_id}) def put_players(name, players) do GenServer.cast( @@ -121,12 +120,12 @@ defmodule Codebattle.WaitingRoom.Server do {:noreply, new_state} end - defp do_match_players(state = %{state: "paused"}) do + defp do_match_players(%{state: "paused"} = state) do Logger.debug("WR #{state.name} paused") state end - defp do_match_players(state = %{players: []}) do + defp do_match_players(%{players: []} = state) do Logger.debug("WR #{state.name} idle") state end diff --git a/services/app/apps/codebattle/lib/codebattle/waiting_room/state.ex b/services/app/apps/codebattle/lib/codebattle/waiting_room/state.ex index 2016c5383..fc49ba13a 100644 --- a/services/app/apps/codebattle/lib/codebattle/waiting_room/state.ex +++ b/services/app/apps/codebattle/lib/codebattle/waiting_room/state.ex @@ -1,4 +1,5 @@ defmodule Codebattle.WaitingRoom.State do + @moduledoc false use TypedStruct typedstruct do diff --git a/services/app/apps/codebattle/lib/codebattle/waiting_room/waiting_room.ex b/services/app/apps/codebattle/lib/codebattle/waiting_room/waiting_room.ex index c7156f47e..6a77bfb7c 100644 --- a/services/app/apps/codebattle/lib/codebattle/waiting_room/waiting_room.ex +++ b/services/app/apps/codebattle/lib/codebattle/waiting_room/waiting_room.ex @@ -1,4 +1,5 @@ defmodule Codebattle.WaitingRoom do + @moduledoc false alias Codebattle.WaitingRoom.Server defdelegate delete_player(name, player_id), to: Server diff --git a/services/app/apps/codebattle/lib/codebattle_web.ex b/services/app/apps/codebattle/lib/codebattle_web.ex index d44e9fd9b..188b62e93 100644 --- a/services/app/apps/codebattle/lib/codebattle_web.ex +++ b/services/app/apps/codebattle/lib/codebattle_web.ex @@ -32,13 +32,13 @@ defmodule CodebattleWeb do use PhoenixMetaTags.TagController use Gettext, backend: CodebattleWeb.Gettext - alias Codebattle.Repo - alias CodebattleWeb.Router.Helpers, as: Routes - import Ecto import Ecto.Query import Phoenix.LiveView.Controller, only: [live_render: 3] + alias Codebattle.Repo + alias CodebattleWeb.Router.Helpers, as: Routes + defp translate_errors(changeset) do Ecto.Changeset.traverse_errors(changeset, fn {msg, _} -> msg end) end @@ -52,20 +52,19 @@ defmodule CodebattleWeb do namespace: CodebattleWeb use PhoenixMetaTags.TagView - - alias CodebattleWeb.Router.Helpers, as: Routes - - # Import convenience functions from controllers - import Phoenix.Controller, only: [view_module: 1] - - # Use all HTML functionality (forms, tags, etc) use Phoenix.HTML - import Phoenix.HTML.Form use Gettext, backend: CodebattleWeb.Gettext import CodebattleWeb.ErrorHelpers import CodebattleWeb.FormHelpers + import Phoenix.Controller, only: [view_module: 1] + import Phoenix.HTML.Form + + alias CodebattleWeb.Router.Helpers, as: Routes + + # Import convenience functions from controllers + # Use all HTML functionality (forms, tags, etc) unquote(view_helpers()) end end @@ -77,17 +76,19 @@ defmodule CodebattleWeb do namespace: CodebattleWeb use PhoenixMetaTags.TagView + use Phoenix.HTML + use Gettext, backend: CodebattleWeb.Gettext + + import CodebattleWeb.ErrorHelpers # Import convenience functions from controllers import Phoenix.Controller, only: [view_module: 1] # Use all HTML functionality (forms, tags, etc) - use Phoenix.HTML - import Phoenix.HTML.{Form, Tag, Link, Format} - - use Gettext, backend: CodebattleWeb.Gettext - - import CodebattleWeb.ErrorHelpers + import Phoenix.HTML.Form + import Phoenix.HTML.Format + import Phoenix.HTML.Link + import Phoenix.HTML.Tag unquote(view_helpers()) end @@ -123,9 +124,10 @@ defmodule CodebattleWeb do def router do quote do use Phoenix.Router - import Plug.Conn + import Phoenix.Controller import Phoenix.LiveView.Router + import Plug.Conn end end diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/chat_channel.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/chat_channel.ex index 9e6a7adfc..5010ab45b 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/chat_channel.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/chat_channel.ex @@ -2,11 +2,11 @@ defmodule CodebattleWeb.ChatChannel do @moduledoc false use CodebattleWeb, :channel - require Logger - alias Codebattle.Chat alias Codebattle.Game + require Logger + def join(topic, _payload, socket) do type = get_chat_type(topic) user = socket.assigns.current_user @@ -15,8 +15,7 @@ defmodule CodebattleWeb.ChatChannel do %{users: users, messages: messages} = Chat.join_chat(type, user) filtered_messages = - messages - |> Enum.filter(fn message -> + Enum.filter(messages, fn message -> if message.meta && message.meta["type"] == "private" do users_private_message?(message, user.id) else @@ -41,7 +40,7 @@ defmodule CodebattleWeb.ChatChannel do meta: payload["meta"] }) - unless get_in(payload, ["meta", "type"]) == "private" do + if get_in(payload, ["meta", "type"]) != "private" do update_playbook(chat_type, :chat_message, %{id: user.id, name: user.name, message: text}) end @@ -151,6 +150,5 @@ defmodule CodebattleWeb.ChatChannel do Codebattle.PubSub.subscribe("chat:tournament:#{id}") end - defp users_private_message?(message, user_id), - do: user_id in [message.user_id, message.meta["target_user_id"]] + defp users_private_message?(message, user_id), do: user_id in [message.user_id, message.meta["target_user_id"]] end diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/game_channel.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/game_channel.ex index 7a54f6f9f..fd6a872d0 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/game_channel.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/game_channel.ex @@ -37,7 +37,7 @@ defmodule CodebattleWeb.GameChannel do ranking = tournament |> Tournament.Ranking.get_first(3) - |> then(&Enum.concat(&1, [Tournament.Ranking.get_by_player(tournament, current_player)])) + |> Enum.concat([Tournament.Ranking.get_by_player(tournament, current_player)]) |> Enum.filter(& &1) |> Enum.uniq_by(& &1.id) @@ -266,9 +266,7 @@ defmodule CodebattleWeb.GameChannel do def handle_in("player:unfollow", %{"user_id" => user_id}, socket) do if socket.assigns.tournament_id do - Codebattle.PubSub.unsubscribe( - "tournament:#{socket.assigns.tournament_id}:player:#{user_id}" - ) + Codebattle.PubSub.unsubscribe("tournament:#{socket.assigns.tournament_id}:player:#{user_id}") end {:noreply, assign(socket, follow_id: nil)} @@ -342,7 +340,7 @@ defmodule CodebattleWeb.GameChannel do {:noreply, socket} end - def handle_info(message = %{event: "waiting_room:player" <> _rest}, socket) do + def handle_info(%{event: "waiting_room:player" <> _rest} = message, socket) do push(socket, message.event, message.payload) {:noreply, socket} diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/invite_channel.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/invite_channel.ex index 61b5da975..8bb287b42 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/invite_channel.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/invite_channel.ex @@ -2,8 +2,9 @@ defmodule CodebattleWeb.InviteChannel do @moduledoc false use CodebattleWeb, :channel - alias Codebattle.{Invite, User} + alias Codebattle.Invite alias Codebattle.PubSub.Message + alias Codebattle.User def join("invites", _payload, socket) do current_user = socket.assigns.current_user @@ -23,10 +24,7 @@ defmodule CodebattleWeb.InviteChannel do {:noreply, socket} end - def handle_info( - %{topic: "invites:" <> _user_id, event: "invites:" <> action, payload: payload}, - socket - ) do + def handle_info(%{topic: "invites:" <> _user_id, event: "invites:" <> action, payload: payload}, socket) do push(socket, "invites:#{action}", payload) {:noreply, socket} end diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/lobby_channel.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/lobby_channel.ex index 413932084..933b26f1d 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/lobby_channel.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/lobby_channel.ex @@ -109,8 +109,7 @@ defmodule CodebattleWeb.LobbyChannel do game.visibility_type == "public" || Game.Helpers.player?(game, user) end - defp add_players(acc, %{"opponent_type" => "bot"}, user), - do: Map.put(acc, :players, [user, Bot.Context.build()]) + defp add_players(acc, %{"opponent_type" => "bot"}, user), do: Map.put(acc, :players, [user, Bot.Context.build()]) defp add_players(acc, _payload, user), do: Map.put(acc, :players, [user]) diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/main_channel.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/main_channel.ex index b385d1d7f..827dc81c5 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/main_channel.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/main_channel.ex @@ -2,12 +2,12 @@ defmodule CodebattleWeb.MainChannel do @moduledoc false use CodebattleWeb, :channel - alias CodebattleWeb.Presence alias Codebattle.Game + alias CodebattleWeb.Presence require Logger - def join("main", params = %{"state" => state}, socket) do + def join("main", %{"state" => state} = params, socket) do current_user = socket.assigns.current_user active_game_id = @@ -24,8 +24,6 @@ defmodule CodebattleWeb.MainChannel do if follow_id do Codebattle.PubSub.subscribe("user:#{follow_id}") Game.Context.get_active_game_id(follow_id) - else - nil end end diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/spectator_channel.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/spectator_channel.ex index 71975a90b..b8f4da014 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/spectator_channel.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/spectator_channel.ex @@ -13,7 +13,7 @@ defmodule CodebattleWeb.SpectatorChannel do with tournament when not is_nil(tournament) <- Tournament.Context.get(tournament_id), true <- Tournament.Helpers.can_access?(tournament, current_user, payload) do - game_id = tournament |> Tournament.Helpers.get_active_game_id(player_id) + game_id = Tournament.Helpers.get_active_game_id(tournament, player_id) matches = Tournament.Helpers.get_matches_by_players(tournament, [player_id]) {:ok, diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/tournament_admin_channel.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/tournament_admin_channel.ex index 492bea053..a959178d4 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/tournament_admin_channel.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/tournament_admin_channel.ex @@ -2,13 +2,13 @@ defmodule CodebattleWeb.TournamentAdminChannel do @moduledoc false use CodebattleWeb, :channel - require Logger - alias Codebattle.Tournament alias Codebattle.Tournament.Helpers alias Codebattle.Tournament.TournamentResult alias Codebattle.UserGameReport + require Logger + def join("tournament_admin:" <> tournament_id, _payload, socket) do current_user = socket.assigns.current_user @@ -18,8 +18,11 @@ defmodule CodebattleWeb.TournamentAdminChannel do Codebattle.PubSub.subscribe("tournament:#{tournament.id}") Codebattle.PubSub.subscribe("tournament:#{tournament.id}:common") - {:ok, get_tournament_join_payload(tournament), - assign(socket, tournament_info: Helpers.tournament_info(tournament))} + { + :ok, + get_tournament_join_payload(tournament), + assign(socket, tournament_info: Helpers.tournament_info(tournament)) + } else _ -> {:error, %{reason: "not_found"}} @@ -348,8 +351,7 @@ defmodule CodebattleWeb.TournamentAdminChannel do defp cast_game_params(%{"task_level" => level}), do: %{task_level: level} - defp cast_game_params(%{"task_id" => id, "timeout_seconds" => seconds}), - do: %{task_id: id, timeout_seconds: seconds} + defp cast_game_params(%{"task_id" => id, "timeout_seconds" => seconds}), do: %{task_id: id, timeout_seconds: seconds} defp cast_game_params(%{"task_id" => id}), do: %{task_id: id} defp cast_game_params(_params), do: %{} diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/tournament_channel.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/tournament_channel.ex index b85e00d94..8c3cdc944 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/tournament_channel.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/tournament_channel.ex @@ -2,11 +2,11 @@ defmodule CodebattleWeb.TournamentChannel do @moduledoc false use CodebattleWeb, :channel - require Logger - alias Codebattle.Tournament alias Codebattle.Tournament.Helpers + require Logger + def join("tournament:" <> tournament_id, payload, socket) do current_user = socket.assigns.current_user @@ -191,7 +191,7 @@ defmodule CodebattleWeb.TournamentChannel do {:noreply, socket} end - def handle_info(message = %{event: "waiting_room:player" <> _rest}, socket) do + def handle_info(%{event: "waiting_room:player" <> _rest} = message, socket) do push(socket, message.event, message.payload) {:noreply, socket} diff --git a/services/app/apps/codebattle/lib/codebattle_web/channels/user_socket.ex b/services/app/apps/codebattle/lib/codebattle_web/channels/user_socket.ex index 71c99e5ea..86cc5af6c 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/channels/user_socket.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/channels/user_socket.ex @@ -1,8 +1,10 @@ defmodule CodebattleWeb.UserSocket do use Phoenix.Socket - require Logger alias Codebattle.User + + require Logger + ## Channels channel("lobby", CodebattleWeb.LobbyChannel) channel("tournament:*", CodebattleWeb.TournamentChannel) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/activity_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/activity_controller.ex index 3b23813c8..c483b18f2 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/activity_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/activity_controller.ex @@ -1,9 +1,11 @@ defmodule CodebattleWeb.Api.V1.ActivityController do use CodebattleWeb, :controller - alias Codebattle.{Repo, UserGame} import Ecto.Query, only: [from: 2] + alias Codebattle.Repo + alias Codebattle.UserGame + defmacro to_char(field, format) do quote do fragment("to_char(?, ?)", unquote(field), unquote(format)) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/event/leaderboard_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/event/leaderboard_controller.ex index eefc3b608..2c7ebe319 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/event/leaderboard_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/event/leaderboard_controller.ex @@ -42,8 +42,8 @@ defmodule CodebattleWeb.Api.V1.Event.LeaderboardController do } %{personal_tournament_id: id} -> - players_limit = Map.get(params, "players_limit", 5) |> cast_int() |> min(100) - clans_limit = Map.get(params, "clans_limit", 40) |> cast_int() |> min(100) + players_limit = params |> Map.get("players_limit", 5) |> cast_int() |> min(100) + clans_limit = params |> Map.get("clans_limit", 40) |> cast_int() |> min(100) %{ page_info: %{page_number: 0, page_size: 0, total_entries: 0, total_pages: 0}, @@ -90,8 +90,7 @@ defmodule CodebattleWeb.Api.V1.Event.LeaderboardController do _ -> default_page_number = cast_int(page_number, 1) - Scope.by_clan() - |> Repo.paginate(%{page: default_page_number, page_size: page_size, total: true}) + Repo.paginate(Scope.by_clan(), %{page: default_page_number, page_size: page_size, total: true}) end page_info = Map.take(result, [:page_number, :page_size, :total_entries, :total_pages]) @@ -114,8 +113,7 @@ defmodule CodebattleWeb.Api.V1.Event.LeaderboardController do _ -> default_page_number = cast_int(page_number, 1) - Scope.by_player() - |> Repo.paginate(%{page: default_page_number, page_size: page_size, total: true}) + Repo.paginate(Scope.by_player(), %{page: default_page_number, page_size: page_size, total: true}) end page_info = Map.take(result, [:page_number, :page_size, :total_entries, :total_pages]) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/feedback_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/feedback_controller.ex index 9e2d58675..c2af00c72 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/feedback_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/feedback_controller.ex @@ -1,10 +1,10 @@ defmodule CodebattleWeb.Api.V1.FeedbackController do use CodebattleWeb, :controller - alias Codebattle.Feedback - import Ecto.Query + alias Codebattle.Feedback + def index(conn, params) do page_number = params |> Map.get("page", "1") |> String.to_integer() page_size = params |> Map.get("page_size", "50") |> String.to_integer() @@ -19,9 +19,7 @@ defmodule CodebattleWeb.Api.V1.FeedbackController do }) end - def create(conn, %{ - "attachments" => attachments - }) do + def create(conn, %{"attachments" => attachments}) do %{ "author_name" => author_name, "fallback" => status, diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/game_activity_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/game_activity_controller.ex index 63917118e..135ca46d6 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/game_activity_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/game_activity_controller.ex @@ -1,9 +1,11 @@ defmodule CodebattleWeb.Api.V1.GameActivityController do use CodebattleWeb, :controller - alias Codebattle.{Repo, Game} import Ecto.Query, only: [from: 2] + alias Codebattle.Game + alias Codebattle.Repo + defmacro to_char(field, format) do quote do fragment("to_char(?, ?)", unquote(field), unquote(format)) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/playbook_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/playbook_controller.ex index a3918acfc..bb1cad0aa 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/playbook_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/playbook_controller.ex @@ -1,11 +1,15 @@ defmodule CodebattleWeb.Api.V1.PlaybookController do use CodebattleWeb, :controller - alias Codebattle.{Game, Repo, User, Task} - alias Codebattle.Game.{Helpers, Server} + import Ecto.Query, warn: false + alias Codebattle.Game + alias Codebattle.Game.Helpers + alias Codebattle.Game.Server alias Codebattle.Playbook - import Ecto.Query, warn: false + alias Codebattle.Repo + alias Codebattle.Task + alias Codebattle.User def approve(conn, %{"game_id" => game_id}) do query = @@ -17,7 +21,7 @@ defmodule CodebattleWeb.Api.V1.PlaybookController do if User.admin?(conn.assigns.current_user) do {:ok, playbook} = - Repo.one(query) |> Playbook.changeset(%{solution_type: "complete"}) |> Repo.update() + query |> Repo.one() |> Playbook.changeset(%{solution_type: "complete"}) |> Repo.update() json(conn, %{ solution_type: playbook.solution_type @@ -39,7 +43,7 @@ defmodule CodebattleWeb.Api.V1.PlaybookController do if User.admin?(conn.assigns.current_user) do {:ok, playbook} = - Repo.one(query) |> Playbook.changeset(%{solution_type: "banned"}) |> Repo.update() + query |> Repo.one() |> Playbook.changeset(%{solution_type: "banned"}) |> Repo.update() json(conn, %{ solution_type: playbook.solution_type @@ -60,7 +64,7 @@ defmodule CodebattleWeb.Api.V1.PlaybookController do ) case Game.Context.get_game!(game_id) do - game = %Game{is_live: true} -> + %Game{is_live: true} = game -> {:ok, records} = Server.get_playbook_records(game_id) winner = Helpers.get_winner(game) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/task_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/task_controller.ex index 9220bd347..e8c29854f 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/task_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/task_controller.ex @@ -1,14 +1,12 @@ defmodule CodebattleWeb.Api.V1.TaskController do use CodebattleWeb, :controller - alias Codebattle.Task alias Codebattle.CodeCheck + alias Codebattle.Task alias CodebattleWeb.Api.TaskView def index(conn, _) do - tasks = - conn.assigns.current_user - |> Task.list_visible() + tasks = Task.list_visible(conn.assigns.current_user) json(conn, %{tasks: TaskView.render_tasks(tasks)}) end @@ -51,16 +49,13 @@ defmodule CodebattleWeb.Api.V1.TaskController do editor_lang: "js" }) do {:ok, asserts} -> - conn - |> json(%{status: "ok", asserts: asserts}) + json(conn, %{status: "ok", asserts: asserts}) {:failure, asserts} -> - conn - |> json(%{status: "failure", asserts: asserts}) + json(conn, %{status: "failure", asserts: asserts}) {:error, asserts, message} -> - conn - |> json(%{status: "error", asserts: asserts, message: message}) + json(conn, %{status: "error", asserts: asserts, message: message}) end end @@ -110,11 +105,7 @@ defmodule CodebattleWeb.Api.V1.TaskController do end end - def check(conn, %{ - "task" => task_params, - "editor_text" => solution_text, - "lang_slug" => lang_slug - }) do + def check(conn, %{"task" => task_params, "editor_text" => solution_text, "lang_slug" => lang_slug}) do task = %Task{ name: Map.get(task_params, "name"), asserts: diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/tournament_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/tournament_controller.ex index ea6bc809e..24f88c1e0 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/tournament_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/tournament_controller.ex @@ -1,14 +1,11 @@ defmodule CodebattleWeb.Api.V1.TournamentController do use CodebattleWeb, :controller - alias Codebattle.Tournament - import Ecto.Query, warn: false - def get_matches( - conn, - %{"tournament_id" => tournament_id, "player_id" => player_id} - ) do + alias Codebattle.Tournament + + def get_matches(conn, %{"tournament_id" => tournament_id, "player_id" => player_id}) do matches = tournament_id |> Tournament.Context.get!() diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/user_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/user_controller.ex index 9f7c74dab..322be619d 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/user_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/user_controller.ex @@ -1,14 +1,14 @@ defmodule CodebattleWeb.Api.V1.UserController do use CodebattleWeb, :controller + import Ecto.Query, warn: false + alias Codebattle.Game alias Codebattle.PremiumRequest alias Codebattle.User alias Codebattle.User.Stats alias CodebattleWeb.Api.UserView - import Ecto.Query, warn: false - def index(conn, params) do payload = UserView.render_rating(params) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/user_game_report_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/user_game_report_controller.ex index b4775eab7..5ff0e714b 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/user_game_report_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/api/v1/user_game_report_controller.ex @@ -4,12 +4,7 @@ defmodule CodebattleWeb.Api.V1.UserGameReportController do alias Codebattle.Game alias Codebattle.UserGameReport - def create(conn, %{ - "game_id" => game_id, - "offender_id" => offender_id, - "reason" => reason, - "comment" => comment - }) do + def create(conn, %{"game_id" => game_id, "offender_id" => offender_id, "reason" => reason, "comment" => comment}) do reporter = conn.assigns.current_user game = Game.Context.get_game!(game_id) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/auth_bind_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/auth_bind_controller.ex index 644c2a411..ef7752fd6 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/auth_bind_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/auth_bind_controller.ex @@ -2,6 +2,11 @@ defmodule CodebattleWeb.AuthBindController do use CodebattleWeb, :controller use Gettext, backend: CodebattleWeb.Gettext + alias Codebattle.Auth.Discord + alias Codebattle.Auth.Github + alias Codebattle.Auth.User.DiscordUser + alias Codebattle.Auth.User.GithubUser + require Logger def request(conn, params) do @@ -11,14 +16,14 @@ defmodule CodebattleWeb.AuthBindController do case provider_name do "github" -> - oauth_github_url = Codebattle.Auth.Github.login_url(%{redirect_uri: redirect_uri}) + oauth_github_url = Github.login_url(%{redirect_uri: redirect_uri}) conn |> redirect(external: oauth_github_url) |> halt() "discord" -> - oauth_discord_url = Codebattle.Auth.Discord.login_url(%{redirect_uri: redirect_uri}) + oauth_discord_url = Discord.login_url(%{redirect_uri: redirect_uri}) conn |> redirect(external: oauth_discord_url) @@ -31,52 +36,48 @@ defmodule CodebattleWeb.AuthBindController do end end - def callback(conn, params = %{"code" => code}) do + def callback(conn, %{"code" => code} = params) do current_user = conn.assigns.current_user - case params["provider"] do - "github" -> - {:ok, profile} = Codebattle.Auth.Github.github_auth(code) - Codebattle.Auth.User.GithubUser.bind(current_user, profile) + case_result = + case params["provider"] do + "github" -> + {:ok, profile} = Github.github_auth(code) + GithubUser.bind(current_user, profile) - "discord" -> - redirect_uri = Routes.auth_bind_url(conn, :callback, "discord") - {:ok, profile} = Codebattle.Auth.Discord.discord_auth(code, redirect_uri) - Codebattle.Auth.User.DiscordUser.bind(current_user, profile) - end - |> case do + "discord" -> + redirect_uri = Routes.auth_bind_url(conn, :callback, "discord") + {:ok, profile} = Discord.discord_auth(code, redirect_uri) + DiscordUser.bind(current_user, profile) + end + + case case_result do {:ok, _user} -> - conn - |> put_flash(:info, gettext("Successfully updated authentication settings")) - |> redirect(to: "/settings") + conn |> put_flash(:info, gettext("Successfully updated authentication settings")) |> redirect(to: "/settings") {:error, reason} -> - conn - |> put_flash(:danger, inspect(reason)) - |> redirect(to: "/settings") + conn |> put_flash(:danger, inspect(reason)) |> redirect(to: "/settings") end end def unbind(conn, params) do current_user = conn.assigns.current_user - case params["provider"] do - "github" -> - Codebattle.Auth.User.GithubUser.unbind(current_user) + case_result = + case params["provider"] do + "github" -> + GithubUser.unbind(current_user) - "discord" -> - Codebattle.Auth.User.DiscordUser.unbind(current_user) - end - |> case do + "discord" -> + DiscordUser.unbind(current_user) + end + + case case_result do {:ok, _user} -> - conn - |> put_flash(:info, gettext("Successfully unbinded authentication settings.")) - |> redirect(to: "/settings") + conn |> put_flash(:info, gettext("Successfully unbinded authentication settings.")) |> redirect(to: "/settings") {:error, reason} -> - conn - |> put_flash(:danger, inspect(reason)) - |> redirect(to: "/settings") + conn |> put_flash(:danger, inspect(reason)) |> redirect(to: "/settings") end end end diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/auth_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/auth_controller.ex index f03143ea0..68f758b68 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/auth_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/auth_controller.ex @@ -2,6 +2,9 @@ defmodule CodebattleWeb.AuthController do use CodebattleWeb, :controller use Gettext, backend: CodebattleWeb.Gettext + alias Codebattle.Auth.Discord + alias Codebattle.Auth.Github + require Logger def token(conn, params) do @@ -29,8 +32,7 @@ defmodule CodebattleWeb.AuthController do Logger.error("Failed to authenticate user: #{inspect(reason)}") if url = Application.get_env(:codebattle, :guest_user_force_redirect_url) do - conn - |> redirect(external: url) + redirect(conn, external: url) else conn |> put_flash(:danger, reason) @@ -44,27 +46,26 @@ defmodule CodebattleWeb.AuthController do # TODO: add next from request prams to callback redirect_uri = Routes.auth_url(conn, :callback, provider_name) - case provider_name do - "github" -> - oauth_github_url = Codebattle.Auth.Github.login_url(%{redirect_uri: redirect_uri}) + case_result = + case provider_name do + "github" -> + oauth_github_url = Github.login_url(%{redirect_uri: redirect_uri}) - conn - |> redirect(external: oauth_github_url) + redirect(conn, external: oauth_github_url) - "discord" -> - oauth_discord_url = Codebattle.Auth.Discord.login_url(%{redirect_uri: redirect_uri}) + "discord" -> + oauth_discord_url = Discord.login_url(%{redirect_uri: redirect_uri}) - conn - |> redirect(external: oauth_discord_url) + redirect(conn, external: oauth_discord_url) - _ -> - conn - |> redirect(to: "/") - end - |> halt() + _ -> + redirect(conn, to: "/") + end + + halt(case_result) end - def callback(conn, params = %{"code" => code}) do + def callback(conn, %{"code" => code} = params) do provider_name = params["provider"] next_path = @@ -74,17 +75,19 @@ defmodule CodebattleWeb.AuthController do next -> next end - case provider_name do - "github" -> - {:ok, profile} = Codebattle.Auth.Github.github_auth(code) - Codebattle.Auth.User.GithubUser.find_or_create(profile) + case_result = + case provider_name do + "github" -> + {:ok, profile} = Github.github_auth(code) + Codebattle.Auth.User.GithubUser.find_or_create(profile) - "discord" -> - redirect_uri = Routes.auth_url(conn, :callback, provider_name) - {:ok, profile} = Codebattle.Auth.Discord.discord_auth(code, redirect_uri) - Codebattle.Auth.User.DiscordUser.find_or_create(profile) - end - |> case do + "discord" -> + redirect_uri = Routes.auth_url(conn, :callback, provider_name) + {:ok, profile} = Discord.discord_auth(code, redirect_uri) + Codebattle.Auth.User.DiscordUser.find_or_create(profile) + end + + case case_result do {:ok, user} -> conn |> put_flash(:info, gettext("Successfully authenticated")) @@ -92,11 +95,10 @@ defmodule CodebattleWeb.AuthController do |> redirect(to: next_path) {:error, reason} -> - conn - # TODO: add flash messages to landing, otherwise users wouldn't get a real error messages - |> put_flash(:danger, inspect(reason)) - |> redirect(to: "/") + conn |> put_flash(:danger, inspect(reason)) |> redirect(to: "/") end + + # TODO: add flash messages to landing, otherwise users wouldn't get a real error messages end def callback(conn, _params) do diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/dev_login_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/dev_login_controller.ex index 61815edac..b94102d86 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/dev_login_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/dev_login_controller.ex @@ -8,8 +8,8 @@ defmodule CodebattleWeb.DevLoginController do params = %{ subscription_type: subscription_type, - name: "#{prefix}-#{:rand.uniform(100_0000)}", - email: "#{prefix}@#{:rand.uniform(100_0000)}.cb", + name: "#{prefix}-#{:rand.uniform(1_000_000)}", + email: "#{prefix}@#{:rand.uniform(1_000_000)}.cb", avatar_url: "/assets/images/logo.svg" } diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/event_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/event_controller.ex index d7aa0d3ff..5a2235932 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/event_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/event_controller.ex @@ -1,10 +1,10 @@ defmodule CodebattleWeb.EventController do use CodebattleWeb, :controller - plug CodebattleWeb.Plugs.AdminOnly - alias Codebattle.Event + plug CodebattleWeb.Plugs.AdminOnly + def index(conn, _params) do conn |> put_meta_tags(%{title: "Codebattle Events"}) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/ext_api/executor_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/ext_api/executor_controller.ex index eae621848..7854e2352 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/ext_api/executor_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/ext_api/executor_controller.ex @@ -1,27 +1,19 @@ defmodule CodebattleWeb.ExtApi.ExecutorController do use CodebattleWeb, :controller + import Plug.Conn + alias Codebattle.CodeCheck.Executor.RemoteRust alias Runner.Languages - import Plug.Conn require Logger plug(CodebattleWeb.Plugs.TokenAuth) - def execute(conn, %{ - "task" => task, - "solution_text" => solution_text, - "lang_slug" => lang_slug - }) do + def execute(conn, %{"task" => task, "solution_text" => solution_text, "lang_slug" => lang_slug}) do {execution_time, result} = :timer.tc(fn -> - %{ - lang_slug: lang_slug, - solution_text: solution_text, - task: task - } - |> RemoteRust.execute(Languages.meta(lang_slug)) + RemoteRust.execute(%{lang_slug: lang_slug, solution_text: solution_text, task: task}, Languages.meta(lang_slug)) end) Logger.error("Proxy execution lang: #{lang_slug}, time: #{div(execution_time, 1_000)} msecs") diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/ext_api/user_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/ext_api/user_controller.ex index b4ac3f3ed..502407bd6 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/ext_api/user_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/ext_api/user_controller.ex @@ -1,10 +1,10 @@ defmodule CodebattleWeb.ExtApi.UserController do use CodebattleWeb, :controller - alias Codebattle.Auth.User - import Plug.Conn + alias Codebattle.Auth.User + plug(CodebattleWeb.Plugs.TokenAuth) @names ~w(Pixel Byte Loop Code Algorithm Debug Script Function Syntax Module Variable Method Object Class Array Integer Float Boolean Pointer Reference Compiler Interpreter Namespace Package Interface Inheritance Polymorphism Abstraction Encapsulation Constructor Destructor Assertion Documentation Comment Library Framework Dependency Repository Branch Merge Conflict Commit Pull Remote Local Agile Scrum Kanban Waterfall Spiral) @@ -44,8 +44,7 @@ defmodule CodebattleWeb.ExtApi.UserController do {:ok, user} -> {:ok, user} - {:error, - %{errors: [name: {_reason, [constraint: :unique, constraint_name: "users_name_index"]}]}} -> + {:error, %{errors: [name: {_reason, [constraint: :unique, constraint_name: "users_name_index"]}]}} -> create_user_with_uniq_name(user_attrs, retries + 1) {:error, changeset} -> diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/fallback_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/fallback_controller.ex index a2f066c27..d67d62ed1 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/fallback_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/fallback_controller.ex @@ -19,7 +19,8 @@ defmodule CodebattleWeb.FallbackController do end def changeset_error_to_string(changeset) do - Ecto.Changeset.traverse_errors(changeset, fn {msg, opts} -> + changeset + |> Ecto.Changeset.traverse_errors(fn {msg, opts} -> Enum.reduce(opts, msg, fn {key, value}, acc -> String.replace(acc, "%{#{key}}", to_string(value)) end) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/game/image_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/game/image_controller.ex index 7eb8cd234..60893881c 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/game/image_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/game/image_controller.ex @@ -40,7 +40,7 @@ defmodule CodebattleWeb.Game.ImageController do ~s(

Codebattle game

) end - defp render_content(game = %{players: [player1]}) do + defp render_content(%{players: [player1]} = game) do ~s(

Game state: #{game.state}

Level: #{game.level}

@@ -48,7 +48,7 @@ defmodule CodebattleWeb.Game.ImageController do ) end - defp render_content(game = %{players: [player1, player2]}) do + defp render_content(%{players: [player1, player2]} = game) do ~s(

Game state: #{game.state}

Level: #{game.level}

diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/game_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/game_controller.ex index fd822c6a9..926234110 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/game_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/game_controller.ex @@ -1,7 +1,7 @@ defmodule CodebattleWeb.GameController do use CodebattleWeb, :controller + import PhoenixGon.Controller - require Logger alias Codebattle.Game alias Codebattle.Game.Context @@ -9,9 +9,10 @@ defmodule CodebattleWeb.GameController do alias Codebattle.Playbook alias Codebattle.User alias Codebattle.UserGameReport + alias CodebattleWeb.Api.GameView alias Runner.Languages - alias CodebattleWeb.Api.GameView + require Logger action_fallback(CodebattleWeb.FallbackController) @@ -187,7 +188,7 @@ defmodule CodebattleWeb.GameController do defp can_see_game(%{subscription_type: :admin}, _game), do: true - defp can_see_game(user = %{subscription_type: :premium}, game) do + defp can_see_game(%{subscription_type: :premium} = user, game) do [first, second] = get_users(game) user.id == first.id || user.id == second.id end diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/live_view_tournament_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/live_view_tournament_controller.ex index ec09d9b84..bccbbd905 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/live_view_tournament_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/live_view_tournament_controller.ex @@ -50,8 +50,7 @@ defmodule CodebattleWeb.LiveViewTournamentController do tournament = Tournament.Context.get!(params["id"]) if Tournament.Helpers.can_moderate?(tournament, current_user) do - conn - |> live_render(CodebattleWeb.Live.Tournament.EditView, + live_render(conn, CodebattleWeb.Live.Tournament.EditView, session: %{"current_user" => current_user, "tournament" => tournament} ) else diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/public_event_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/public_event_controller.ex index e905f1d9a..fb9838188 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/public_event_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/public_event_controller.ex @@ -1,11 +1,11 @@ defmodule CodebattleWeb.PublicEventController do use CodebattleWeb, :controller + import PhoenixGon.Controller + alias Codebattle.Event alias Codebattle.Tournament - import PhoenixGon.Controller - def show(conn, %{"slug" => slug}) do event = Event.get_by_slug!(slug) tournaments = Tournament.Context.get_all_by_event_id!(event.id) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/raw_task_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/raw_task_controller.ex index 4857cee0e..fdf3b6d36 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/raw_task_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/raw_task_controller.ex @@ -8,11 +8,7 @@ defmodule CodebattleWeb.RawTaskController do task = Task.get!(id) if Task.can_see_task?(task, conn.assigns.current_user) do - conn - |> render("show.html", %{ - task: task, - current_user: conn.assigns.current_user - }) + render(conn, "show.html", %{task: task, current_user: conn.assigns.current_user}) else conn |> put_status(:not_found) diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/task_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/task_controller.ex index 2dfa04fad..941bf0aec 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/task_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/task_controller.ex @@ -1,12 +1,12 @@ defmodule CodebattleWeb.TaskController do use CodebattleWeb, :controller - alias Codebattle.Task + import PhoenixGon.Controller + alias Codebattle.Game + alias Codebattle.Task alias CodebattleWeb.Api.GameView - import PhoenixGon.Controller - def index(conn, _params) do tasks = Task.list_visible(conn.assigns.current_user) @@ -44,10 +44,8 @@ defmodule CodebattleWeb.TaskController do if Task.can_see_task?(task, conn.assigns.current_user) do # played_count = Task.get_played_count(id) game = - Game.Context.create_empty_game( - conn.assigns.current_user.id, - task - ) + conn.assigns.current_user.id + |> Game.Context.create_empty_game(task) |> GameView.render_game(nil) conn diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament/admin_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament/admin_controller.ex index 4cbad62cb..13fbab9fe 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament/admin_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament/admin_controller.ex @@ -19,7 +19,7 @@ defmodule CodebattleWeb.Tournament.AdminController do conn |> put_status(:not_found) |> json(%{error: "NOT_FOUND"}) - |> halt + |> halt() end end end diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament/image_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament/image_controller.ex index e99d9be7c..d834029fe 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament/image_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament/image_controller.ex @@ -12,7 +12,7 @@ defmodule CodebattleWeb.Tournament.ImageController do tournament -> {:ok, image} = tournament - |> render_image + |> render_image() |> HtmlToImage.convert(width: 777, quality: 100) conn diff --git a/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament_controller.ex b/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament_controller.ex index 6404c9247..b3e1554cc 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament_controller.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/controllers/tournament_controller.ex @@ -2,6 +2,7 @@ defmodule CodebattleWeb.TournamentController do use CodebattleWeb, :controller import PhoenixGon.Controller + alias Codebattle.Tournament def index(conn, _params) do diff --git a/services/app/apps/codebattle/lib/codebattle_web/live/components/tournament/create_form.ex b/services/app/apps/codebattle/lib/codebattle_web/live/components/tournament/create_form.ex index 401073eaf..5d4119613 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/live/components/tournament/create_form.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/live/components/tournament/create_form.ex @@ -1,5 +1,7 @@ defmodule CodebattleWeb.Live.Tournament.CreateFormComponent do + @moduledoc false use CodebattleWeb, :live_component + import CodebattleWeb.ErrorHelpers @impl true diff --git a/services/app/apps/codebattle/lib/codebattle_web/live/components/tournament/edit_form.ex b/services/app/apps/codebattle/lib/codebattle_web/live/components/tournament/edit_form.ex index cfc22b1b9..b2ba136e9 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/live/components/tournament/edit_form.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/live/components/tournament/edit_form.ex @@ -1,5 +1,7 @@ defmodule CodebattleWeb.Live.Tournament.EditFormComponent do + @moduledoc false use CodebattleWeb, :live_component + import CodebattleWeb.ErrorHelpers @impl true diff --git a/services/app/apps/codebattle/lib/codebattle_web/live/event/leaderboard_view.ex b/services/app/apps/codebattle/lib/codebattle_web/live/event/leaderboard_view.ex index b712038b3..48a42030a 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/live/event/leaderboard_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/live/event/leaderboard_view.ex @@ -1,6 +1,5 @@ defmodule CodebattleWeb.Live.Event.LeaderboardView do use CodebattleWeb, :live_view - use Gettext, backend: CodebattleWeb.Gettext @impl true diff --git a/services/app/apps/codebattle/lib/codebattle_web/live/tournament/edit_view.ex b/services/app/apps/codebattle/lib/codebattle_web/live/tournament/edit_view.ex index 71122a5df..9fded7205 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/live/tournament/edit_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/live/tournament/edit_view.ex @@ -4,11 +4,11 @@ defmodule CodebattleWeb.Live.Tournament.EditView do import Ecto.Changeset - require Logger - alias Codebattle.Tournament alias CodebattleWeb.Live.Tournament.EditFormComponent + require Logger + @impl true def mount(_params, session, socket) do user_timezone = get_in(socket.private, [:connect_params, "timezone"]) || "UTC" @@ -53,7 +53,7 @@ defmodule CodebattleWeb.Live.Tournament.EditView do changeset = Tournament.Context.validate( - Map.merge(params, %{"user_timezone" => user_timezone}), + Map.put(params, "user_timezone", user_timezone), tournament ) @@ -81,12 +81,10 @@ defmodule CodebattleWeb.Live.Tournament.EditView do case Tournament.Context.update( tournament, - Map.merge(params, %{"user_timezone" => user_timezone}) + Map.put(params, "user_timezone", user_timezone) ) do {:ok, tournament} -> - {:noreply, - socket - |> redirect(to: "/tournaments/#{tournament.id}")} + {:noreply, redirect(socket, to: "/tournaments/#{tournament.id}")} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, changeset: changeset)} diff --git a/services/app/apps/codebattle/lib/codebattle_web/live/tournament/index_view.ex b/services/app/apps/codebattle/lib/codebattle_web/live/tournament/index_view.ex index 1dc2902bd..edd7b531a 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/live/tournament/index_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/live/tournament/index_view.ex @@ -2,11 +2,11 @@ defmodule CodebattleWeb.Live.Tournament.IndexView do use CodebattleWeb, :live_view use Timex + import CodebattleWeb.TournamentView + alias Codebattle.Tournament alias CodebattleWeb.Live.Tournament.CreateFormComponent - import CodebattleWeb.TournamentView - @impl true def mount(_params, session, socket) do user_timezone = get_in(socket.private, [:connect_params, "timezone"]) || "UTC" @@ -81,7 +81,7 @@ defmodule CodebattleWeb.Live.Tournament.IndexView do end @impl true - def handle_event(_event, _params, socket = %{assigns: %{current_user: %{is_guest: true}}}) do + def handle_event(_event, _params, %{assigns: %{current_user: %{is_guest: true}}} = socket) do {:noreply, socket} end @@ -90,7 +90,7 @@ defmodule CodebattleWeb.Live.Tournament.IndexView do creator = socket.assigns.current_user changeset = - Tournament.Context.validate(Map.merge(params, %{"creator" => creator})) + Tournament.Context.validate(Map.put(params, "creator", creator)) {:noreply, assign(socket, changeset: changeset)} end @@ -108,9 +108,7 @@ defmodule CodebattleWeb.Live.Tournament.IndexView do case Tournament.Context.create(params) do {:ok, tournament} -> - {:noreply, - socket - |> redirect(to: "/tournaments/#{tournament.id}")} + {:noreply, redirect(socket, to: "/tournaments/#{tournament.id}")} {:error, %Ecto.Changeset{} = changeset} -> {:noreply, assign(socket, changeset: changeset)} diff --git a/services/app/apps/codebattle/lib/codebattle_web/live/tournament/timer_view.ex b/services/app/apps/codebattle/lib/codebattle_web/live/tournament/timer_view.ex index f93414712..8d44bb788 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/live/tournament/timer_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/live/tournament/timer_view.ex @@ -4,7 +4,7 @@ defmodule CodebattleWeb.Live.Tournament.TimerView do require Logger - @timer_tick_frequency :timer.seconds(1) + @timer_tick_frequency to_timeout(second: 1) @impl true def mount(_params, session, socket) do diff --git a/services/app/apps/codebattle/lib/codebattle_web/plugs/admin_only.ex b/services/app/apps/codebattle/lib/codebattle_web/plugs/admin_only.ex index b1a703efc..428a5450e 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/plugs/admin_only.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/plugs/admin_only.ex @@ -1,11 +1,12 @@ defmodule CodebattleWeb.Plugs.AdminOnly do - alias Codebattle.User - + @moduledoc false use Gettext, backend: CodebattleWeb.Gettext import Phoenix.Controller import Plug.Conn + alias Codebattle.User + @spec init(Keyword.t()) :: Keyword.t() def init(opts), do: opts diff --git a/services/app/apps/codebattle/lib/codebattle_web/plugs/api_require_auth.ex b/services/app/apps/codebattle/lib/codebattle_web/plugs/api_require_auth.ex index d3548250d..e628c6986 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/plugs/api_require_auth.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/plugs/api_require_auth.ex @@ -1,6 +1,7 @@ defmodule CodebattleWeb.Plugs.ApiRequireAuth do - import Plug.Conn + @moduledoc false import Phoenix.Controller + import Plug.Conn def init(options), do: options @@ -9,7 +10,7 @@ defmodule CodebattleWeb.Plugs.ApiRequireAuth do conn |> put_status(:unauthorized) |> json(%{error: "oiblz"}) - |> halt + |> halt() else conn end diff --git a/services/app/apps/codebattle/lib/codebattle_web/plugs/assign_current_user.ex b/services/app/apps/codebattle/lib/codebattle_web/plugs/assign_current_user.ex index 621bc84a1..7c828c1a9 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/plugs/assign_current_user.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/plugs/assign_current_user.ex @@ -1,6 +1,7 @@ defmodule CodebattleWeb.Plugs.AssignCurrentUser do - import Plug.Conn + @moduledoc false import Phoenix.Controller + import Plug.Conn alias Codebattle.User alias CodebattleWeb.Router.Helpers, as: Routes @@ -14,7 +15,7 @@ defmodule CodebattleWeb.Plugs.AssignCurrentUser do case {user_id, conn.request_path} do {nil, path} when path in ["/auth/token/", "/auth/token"] -> - conn |> assign(:current_user, User.build_guest()) + assign(conn, :current_user, User.build_guest()) {nil, _path} -> handle_guest(conn) @@ -36,7 +37,7 @@ defmodule CodebattleWeb.Plugs.AssignCurrentUser do defp handle_guest(conn) do if Application.get_env(:codebattle, :allow_guests) do - conn |> assign(:current_user, User.build_guest()) + assign(conn, :current_user, User.build_guest()) else if url = Application.get_env(:codebattle, :guest_user_force_redirect_url) do conn diff --git a/services/app/apps/codebattle/lib/codebattle_web/plugs/cors.ex b/services/app/apps/codebattle/lib/codebattle_web/plugs/cors.ex index 9b4e0ed6a..31aa35c99 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/plugs/cors.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/plugs/cors.ex @@ -1,4 +1,5 @@ defmodule CodebattleWeb.Plugs.CORSPlug do + @moduledoc false import Plug.Conn def init(opts), do: opts diff --git a/services/app/apps/codebattle/lib/codebattle_web/plugs/force_redirect.ex b/services/app/apps/codebattle/lib/codebattle_web/plugs/force_redirect.ex index 454b19175..bba8f3cc2 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/plugs/force_redirect.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/plugs/force_redirect.ex @@ -1,6 +1,7 @@ defmodule CodebattleWeb.Plugs.ForceRedirect do - import Plug.Conn + @moduledoc false import Phoenix.Controller + import Plug.Conn alias Codebattle.User diff --git a/services/app/apps/codebattle/lib/codebattle_web/plugs/locale.ex b/services/app/apps/codebattle/lib/codebattle_web/plugs/locale.ex index 61c994476..ae89c3b1c 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/plugs/locale.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/plugs/locale.ex @@ -2,8 +2,8 @@ defmodule CodebattleWeb.Plugs.Locale do @moduledoc """ I18n configuration """ - import Plug.Conn import PhoenixGon.Controller + import Plug.Conn def init(_opts), do: nil @@ -16,8 +16,7 @@ defmodule CodebattleWeb.Plugs.Locale do Application.get_env(:codebattle, :default_locale) end - conn - |> put_locale(locale) + put_locale(conn, locale) end defp put_locale(conn, locale) do diff --git a/services/app/apps/codebattle/lib/codebattle_web/plugs/require_auth.ex b/services/app/apps/codebattle/lib/codebattle_web/plugs/require_auth.ex index b0ac02385..7bcb88101 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/plugs/require_auth.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/plugs/require_auth.ex @@ -1,11 +1,12 @@ defmodule CodebattleWeb.Plugs.RequireAuth do - alias CodebattleWeb.Router.Helpers, as: Routes - + @moduledoc false use Gettext, backend: CodebattleWeb.Gettext import Phoenix.Controller import Plug.Conn + alias CodebattleWeb.Router.Helpers, as: Routes + def init(options), do: options def call(conn, _) do diff --git a/services/app/apps/codebattle/lib/codebattle_web/plugs/token_auth.ex b/services/app/apps/codebattle/lib/codebattle_web/plugs/token_auth.ex index b6b81d099..d75d3ae8d 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/plugs/token_auth.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/plugs/token_auth.ex @@ -1,6 +1,7 @@ defmodule CodebattleWeb.Plugs.TokenAuth do - import Plug.Conn + @moduledoc false import Phoenix.Controller + import Plug.Conn def init(options), do: options @@ -13,7 +14,7 @@ defmodule CodebattleWeb.Plugs.TokenAuth do conn |> put_status(:unauthorized) |> json(%{error: "oiblz"}) - |> halt + |> halt() end end end diff --git a/services/app/apps/codebattle/lib/codebattle_web/presence.ex b/services/app/apps/codebattle/lib/codebattle_web/presence.ex index fa738ab82..13bf68625 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/presence.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/presence.ex @@ -1,4 +1,5 @@ defmodule CodebattleWeb.Presence do + @moduledoc false use Phoenix.Presence, otp_app: :codebattle, pubsub_server: CodebattleWeb.PubSub diff --git a/services/app/apps/codebattle/lib/codebattle_web/router.ex b/services/app/apps/codebattle/lib/codebattle_web/router.ex index c1f63c7ca..87b22c8d9 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/router.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/router.ex @@ -4,10 +4,13 @@ defmodule CodebattleWeb.Router do import Phoenix.LiveDashboard.Router + alias CodebattleWeb.Plugs.AssignCurrentUser + alias CodebattleWeb.Plugs.ForceRedirect + require Logger pipeline :admins_only do - plug(CodebattleWeb.Plugs.AssignCurrentUser) + plug(AssignCurrentUser) plug(CodebattleWeb.Plugs.AdminOnly) end @@ -24,8 +27,8 @@ defmodule CodebattleWeb.Router do plug(:fetch_session) plug(:fetch_flash) plug(:fetch_live_flash) - plug(CodebattleWeb.Plugs.AssignCurrentUser) - plug(CodebattleWeb.Plugs.ForceRedirect) + plug(AssignCurrentUser) + plug(ForceRedirect) plug(:protect_from_forgery) plug(:put_secure_browser_headers) plug(PhoenixGon.Pipeline) @@ -40,8 +43,8 @@ defmodule CodebattleWeb.Router do pipeline :api do plug(:accepts, ["json"]) plug(:fetch_session) - plug(CodebattleWeb.Plugs.AssignCurrentUser) - plug(CodebattleWeb.Plugs.ForceRedirect) + plug(AssignCurrentUser) + plug(ForceRedirect) plug(:protect_from_forgery) plug(:put_secure_browser_headers) end @@ -208,9 +211,7 @@ defmodule CodebattleWeb.Router do end # only for dev-admin liveView experiments - resources("/live_view_tournaments", LiveViewTournamentController, - only: [:index, :show, :edit] - ) + resources("/live_view_tournaments", LiveViewTournamentController, only: [:index, :show, :edit]) end scope "/feature-flags" do @@ -222,14 +223,14 @@ defmodule CodebattleWeb.Router do conn |> put_status(:not_found) |> json(%{error: "NOT_FOUND"}) - |> halt + |> halt() end def handle_errors(conn, %{reason: %Phoenix.Router.NoRouteError{}}) do conn |> put_status(:not_found) |> json(%{error: "NOT_FOUND"}) - |> halt + |> halt() end def handle_errors(conn, %{kind: _kind, reason: reason}) do diff --git a/services/app/apps/codebattle/lib/codebattle_web/telemetry.ex b/services/app/apps/codebattle/lib/codebattle_web/telemetry.ex index 28fae5c22..1745b43e3 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/telemetry.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/telemetry.ex @@ -1,5 +1,7 @@ defmodule CodebattleWeb.Telemetry do + @moduledoc false use Supervisor + import Telemetry.Metrics def start_link(_) do diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/api/game_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/api/game_view.ex index e7664c16a..a4732499e 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/api/game_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/api/game_view.ex @@ -1,11 +1,11 @@ defmodule CodebattleWeb.Api.GameView do use CodebattleWeb, :view - alias Runner.Languages - alias Codebattle.CodeCheck - import Codebattle.Game.Helpers + alias Codebattle.CodeCheck + alias Runner.Languages + def render_game(game, score) do %{ id: get_game_id(game), diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/api/user_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/api/user_view.ex index 5d05f784e..786180c1c 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/api/user_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/api/user_view.ex @@ -1,11 +1,11 @@ defmodule CodebattleWeb.Api.UserView do use CodebattleWeb, :view - alias Codebattle.User.Scope - alias Codebattle.Repo - import Ecto.Query, warn: false + alias Codebattle.Repo + alias Codebattle.User.Scope + def render_rating(params) do page_number = params diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/error_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/error_view.ex index 0ff3ed98c..a198e6d6b 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/error_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/error_view.ex @@ -5,7 +5,7 @@ defmodule CodebattleWeb.ErrorView do def render("404.html", assigns) do render( "404_page.html", - Map.merge(assigns, %{msg: assigns[:msg] || gettext("Page not found")}) + Map.put(assigns, :msg, assigns[:msg] || gettext("Page not found")) ) end diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/event_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/event_view.ex index 75c56241a..0922e9779 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/event_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/event_view.ex @@ -4,13 +4,13 @@ defmodule CodebattleWeb.EventView do def format_datetime(d, tz \\ "UTC") def format_datetime(nil, _time_zone), do: "none" - def format_datetime(datetime = %NaiveDateTime{}, timezone) do + def format_datetime(%NaiveDateTime{} = datetime, timezone) do datetime |> DateTime.from_naive!("UTC") |> format_datetime(timezone) end - def format_datetime(datetime = %DateTime{}, timezone) do + def format_datetime(%DateTime{} = datetime, timezone) do datetime |> DateTime.shift_zone!(timezone) |> Timex.format!("%Y-%m-%d %H:%M %Z", :strftime) diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/game_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/game_view.ex index 7c77a4324..783961a20 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/game_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/game_view.ex @@ -1,5 +1,6 @@ defmodule CodebattleWeb.GameView do use CodebattleWeb, :view + import Codebattle.Game.Helpers def user_name(%Codebattle.User{name: name, rating: rating}) do @@ -17,8 +18,7 @@ defmodule CodebattleWeb.GameView do end def result(%Codebattle.Game{users: users, user_games: user_games}) do - users - |> Enum.map_join(", ", fn u -> + Enum.map_join(users, ", ", fn u -> "#{user_name(u)} #{Enum.find(user_games, fn ug -> ug.user_id == u.id end).result}" end) end diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/layout_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/layout_view.ex index c990367e7..00eee85a6 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/layout_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/layout_view.ex @@ -1,7 +1,8 @@ defmodule CodebattleWeb.LayoutView do use CodebattleWeb, :view - import PhoenixGon.View + import CodebattleWeb.Router.Helpers + import PhoenixGon.View @app_version Application.compile_env(:codebattle, :app_version) @colors [ diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/raw_task_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/raw_task_view.ex index 5178154c6..ff3c97233 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/raw_task_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/raw_task_view.ex @@ -7,7 +7,7 @@ defmodule CodebattleWeb.RawTaskView do def render_tags(task), do: Enum.join(task.tags, ", ") def render_asserts(task) do - task.asserts |> Jason.encode!() + Jason.encode!(task.asserts) end def render_markdown(nil), do: "" diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/root_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/root_view.ex index a4d32bdba..88bcd454f 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/root_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/root_view.ex @@ -1,10 +1,11 @@ defmodule CodebattleWeb.RootView do use CodebattleWeb, :view - alias Codebattle.Feedback import CodebattleWeb.Router.Helpers - def csrf_token() do + alias Codebattle.Feedback + + def csrf_token do Plug.CSRFProtection.get_csrf_token() end @@ -15,17 +16,11 @@ defmodule CodebattleWeb.RootView do end end - def feedback() do - Feedback.get_all() |> Enum.map(&item/1) + def feedback do + Enum.map(Feedback.get_all(), &item/1) end - defp item(%{ - title: title, - description: description, - pubDate: pub_date, - link: link, - guid: guid - }) do + defp item(%{title: title, description: description, pubDate: pub_date, link: link, guid: guid}) do """ #{title} diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/session_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/session_view.ex index f3650ebe8..998ecdba5 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/session_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/session_view.ex @@ -1,7 +1,7 @@ defmodule CodebattleWeb.SessionView do use CodebattleWeb, :view - def csrf_token() do + def csrf_token do Plug.CSRFProtection.get_csrf_token() end end diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/task_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/task_view.ex index ee50253bd..2a8174e67 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/task_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/task_view.ex @@ -7,7 +7,7 @@ defmodule CodebattleWeb.TaskView do def render_tags(task), do: Enum.join(task.tags, ", ") def render_asserts(task) do - task.asserts |> Jason.encode!() + Jason.encode!(task.asserts) end def render_markdown(nil), do: "" diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/tournament_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/tournament_view.ex index e53f64f05..c4bd402eb 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/tournament_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/tournament_view.ex @@ -1,27 +1,27 @@ defmodule CodebattleWeb.TournamentView do use CodebattleWeb, :view - def csrf_token() do + def csrf_token do Plug.CSRFProtection.get_csrf_token() end def format_datetime(nil), do: "none" def format_datetime(nil, _time_zone), do: "none" - def format_datetime(datetime = %NaiveDateTime{}, user_timezone) do + def format_datetime(%NaiveDateTime{} = datetime, user_timezone) do datetime |> DateTime.from_naive!("UTC") |> format_datetime(user_timezone) end - def format_datetime(datetime = %DateTime{}, user_timezone) do + def format_datetime(%DateTime{} = datetime, user_timezone) do datetime |> DateTime.shift_zone!(user_timezone) |> Timex.format!("%Y-%m-%d %H:%M %Z", :strftime) end def get_link_params(match, %{id: id}) do - is_participant = Enum.map(match.players, & &1.id) |> Enum.any?(&(&1 == id)) + is_participant = match.players |> Enum.map(& &1.id) |> Enum.any?(&(&1 == id)) case {match.state, is_participant} do {"pending", true} -> {"Pending", "bg-warning"} diff --git a/services/app/apps/codebattle/lib/codebattle_web/views/user_view.ex b/services/app/apps/codebattle/lib/codebattle_web/views/user_view.ex index 7731b4d92..3be443c1d 100644 --- a/services/app/apps/codebattle/lib/codebattle_web/views/user_view.ex +++ b/services/app/apps/codebattle/lib/codebattle_web/views/user_view.ex @@ -1,7 +1,7 @@ defmodule CodebattleWeb.UserView do use CodebattleWeb, :view - def csrf_token() do + def csrf_token do Plug.CSRFProtection.get_csrf_token() end end diff --git a/services/app/apps/codebattle/lib/ecto_map_set.ex b/services/app/apps/codebattle/lib/ecto_map_set.ex index fa73b3dc8..ff4520a8d 100644 --- a/services/app/apps/codebattle/lib/ecto_map_set.ex +++ b/services/app/apps/codebattle/lib/ecto_map_set.ex @@ -92,7 +92,7 @@ defmodule EctoMapSet do def cast(data, %{of: :term, non_executable: true}) do result = data - |> reject_nonexecutable + |> reject_nonexecutable() |> MapSet.new(data) {:ok, result} @@ -127,7 +127,7 @@ defmodule EctoMapSet do end defp reject_nonexecutable(tup) when is_tuple(tup) do - tup |> Tuple.to_list() |> reject_nonexecutable + tup |> Tuple.to_list() |> reject_nonexecutable() tup end @@ -136,7 +136,7 @@ defmodule EctoMapSet do @impl true def load(nil, _, _), do: {:ok, nil} - def load(data, _, opts = %{of: :term, safety: :drop}) do + def load(data, _, %{of: :term, safety: :drop} = opts) do binary_to_term = binary_to_term_fn(opts) result = @@ -153,7 +153,7 @@ defmodule EctoMapSet do {:ok, result} end - def load(data, _, opts = %{of: :term}) do + def load(data, _, %{of: :term} = opts) do binary_to_term = binary_to_term_fn(opts) {:ok, MapSet.new(data, binary_to_term)} rescue @@ -196,7 +196,7 @@ defmodule EctoMapSet do end defp binary_to_term_fn(opts) do - safety = List.wrap(unless opts[:safety] == :unsafe, do: :safe) + safety = List.wrap(if opts[:safety] != :unsafe, do: :safe) if opts[:non_executable] do &Plug.Crypto.non_executable_binary_to_term(&1, safety) diff --git a/services/app/apps/codebattle/lib/encoder.ex b/services/app/apps/codebattle/lib/encoder.ex index f77d7bc76..d63e50d80 100644 --- a/services/app/apps/codebattle/lib/encoder.ex +++ b/services/app/apps/codebattle/lib/encoder.ex @@ -1,4 +1,5 @@ defmodule Encoder do + @moduledoc false defimpl Jason.Encoder, for: MapSet do def encode(map_set, opts) do Jason.Encode.list(MapSet.to_list(map_set), opts) diff --git a/services/app/apps/codebattle/lib/mix/get_contributors.ex b/services/app/apps/codebattle/lib/mix/get_contributors.ex index 26b278cb4..0a04cec43 100644 --- a/services/app/apps/codebattle/lib/mix/get_contributors.ex +++ b/services/app/apps/codebattle/lib/mix/get_contributors.ex @@ -1,24 +1,20 @@ defmodule Mix.Tasks.GetContributors do + @shortdoc "Get contributors for landing" + @moduledoc false use Mix.Task - @shortdoc "Get contributors for landing" - @repos %{ - codebattle: - ~c"https://api.github.com/repos/hexlet-codebattle/codebattle/contributors?per_page=1000", - asserts: - ~c"https://api.github.com/repos/hexlet-codebattle/battle_asserts/contributors?per_page=1000", - extension: - ~c"https://api.github.com/repos/hexlet-codebattle/chrome_extension/contributors?per_page=1000" + codebattle: ~c"https://api.github.com/repos/hexlet-codebattle/codebattle/contributors?per_page=1000", + asserts: ~c"https://api.github.com/repos/hexlet-codebattle/battle_asserts/contributors?per_page=1000", + extension: ~c"https://api.github.com/repos/hexlet-codebattle/chrome_extension/contributors?per_page=1000" } def run(_) do {:ok, _started} = Application.ensure_all_started(:req) - @repos - |> Enum.each(fn {repo_name, url} -> + Enum.each(@repos, fn {repo_name, url} -> content = url |> Req.get!() @@ -31,9 +27,7 @@ defmodule Mix.Tasks.GetContributors do |> Enum.map_join("", fn params -> template(params) end) File.cwd!() - |> Path.join( - "apps/codebattle/lib/codebattle_web/templates/root/_contributors_#{repo_name}.html.heex" - ) + |> Path.join("apps/codebattle/lib/codebattle_web/templates/root/_contributors_#{repo_name}.html.heex") |> File.write!(content) end) end diff --git a/services/app/apps/codebattle/lib/mix/tasks/asserts/upload.ex b/services/app/apps/codebattle/lib/mix/tasks/asserts/upload.ex index 2d8bf5857..ca818c3eb 100644 --- a/services/app/apps/codebattle/lib/mix/tasks/asserts/upload.ex +++ b/services/app/apps/codebattle/lib/mix/tasks/asserts/upload.ex @@ -1,10 +1,10 @@ defmodule Mix.Tasks.Asserts.Upload do + @shortdoc "Upload asserts from battle_asserts repo" + @moduledoc false use Mix.Task - @shortdoc "Upload asserts from battle_asserts repo" - def run(_) do {:ok, _started} = Application.ensure_all_started(:codebattle) Codebattle.TasksImporter.run_sync() diff --git a/services/app/apps/codebattle/lib/time_helper.ex b/services/app/apps/codebattle/lib/time_helper.ex index 31198b4c7..30be05a36 100644 --- a/services/app/apps/codebattle/lib/time_helper.ex +++ b/services/app/apps/codebattle/lib/time_helper.ex @@ -1,4 +1,5 @@ defmodule TimeHelper do + @moduledoc false def utc_now do if Application.get_env(:codebattle, :freeze_time) do ~N[2019-01-05 19:11:45] diff --git a/services/app/apps/codebattle/lib/utils.ex b/services/app/apps/codebattle/lib/utils.ex index dab8daa5d..702150b74 100644 --- a/services/app/apps/codebattle/lib/utils.ex +++ b/services/app/apps/codebattle/lib/utils.ex @@ -1,4 +1,5 @@ defmodule Utils do + @moduledoc false def blank?(x) when is_binary(x) do String.trim(x) == "" end @@ -12,8 +13,6 @@ defmodule Utils do def presence(x) do if present?(x) do x - else - nil end end diff --git a/services/app/apps/codebattle/mix.exs b/services/app/apps/codebattle/mix.exs index 611efff7e..c1db74dad 100644 --- a/services/app/apps/codebattle/mix.exs +++ b/services/app/apps/codebattle/mix.exs @@ -81,6 +81,7 @@ defmodule Codebattle.MixProject do # dev_and_test {:credo, "~> 1.6", only: [:dev, :test], runtime: false}, + {:styler, "~> 1.4", only: [:dev, :test], runtime: false}, # dev {:phoenix_live_reload, "~> 1.3", only: :dev}, diff --git a/services/app/apps/codebattle/priv/repo/seeds.exs b/services/app/apps/codebattle/priv/repo/seeds.exs index e64f729a0..8a9563eac 100644 --- a/services/app/apps/codebattle/priv/repo/seeds.exs +++ b/services/app/apps/codebattle/priv/repo/seeds.exs @@ -1,20 +1,18 @@ alias Codebattle.Clan alias Codebattle.Game alias Codebattle.Repo +alias Codebattle.TaskPack alias Codebattle.User alias Codebattle.UserGame -alias Codebattle.TaskPack levels = ["elementary", "easy", "medium", "hard"] -1..30 -|> Enum.each(fn x -> +Enum.each(1..30, fn x -> for level <- levels do task_params = %{ level: level, name: "task_#{level}_#{x}", - tags: - Enum.take_random(["math", "lol", "kek", "asdf", "strings", "hash-maps", "collections"], 3), + tags: Enum.take_random(["math", "lol", "kek", "asdf", "strings", "hash-maps", "collections"], 3), origin: "github", state: "active", visibility: "public", @@ -153,10 +151,10 @@ levels = ["elementary", "easy", "medium", "hard"] end) creator = %{ - name: "User1_admin#{Timex.format!(Timex.now(), "%FT%T%:z", :strftime)}", + name: "User1_admin#{Timex.format!(DateTime.utc_now(), "%FT%T%:z", :strftime)}", is_bot: false, rating: 1300, - email: "admin@user1#{Timex.format!(Timex.now(), "%FT%T%:z", :strftime)}", + email: "admin@user1#{Timex.format!(DateTime.utc_now(), "%FT%T%:z", :strftime)}", avatar_url: "/assets/images/logo.svg", lang: "ruby", inserted_at: TimeHelper.utc_now(), @@ -180,14 +178,13 @@ creator = %{ }) |> Repo.insert!() -now = Timex.now() +now = DateTime.utc_now() one_month_ago = Timex.shift(now, months: -1) two_weeks_ago = Timex.shift(now, weeks: -2) five_days_ago = Timex.shift(now, days: -5) six_hours_ago = Timex.shift(now, hours: -6) -[one_month_ago, two_weeks_ago, five_days_ago, six_hours_ago] -|> Enum.each(fn t -> +Enum.each([one_month_ago, two_weeks_ago, five_days_ago, six_hours_ago], fn t -> game_params = %{ state: "game_over", level: "easy", @@ -322,7 +319,7 @@ end) tokens = Enum.map(1..100, fn id -> - t = Timex.now() + t = DateTime.utc_now() clan_id = 50 diff --git a/services/app/apps/codebattle/test/codebattle/bot/playbook_player_test.exs b/services/app/apps/codebattle/test/codebattle/bot/playbook_player_test.exs index f3624da17..5970d9c63 100644 --- a/services/app/apps/codebattle/test/codebattle/bot/playbook_player_test.exs +++ b/services/app/apps/codebattle/test/codebattle/bot/playbook_player_test.exs @@ -1,10 +1,10 @@ defmodule Codebattle.Bot.PlaybookPlayerTest do use Codebattle.IntegrationCase - alias CodebattleWeb.{GameChannel, UserSocket} - alias Codebattle.Game.Helpers - alias Codebattle.Game alias Codebattle.Bot + alias Codebattle.Game + alias Codebattle.Game.Helpers + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket test "Bot playing with user and bot wins", %{conn: conn} do @@ -90,7 +90,7 @@ defmodule Codebattle.Bot.PlaybookPlayerTest do :timer.sleep(3_000) # bot write_some_text - game = Game.Context.get_game!(game.id) |> Repo.preload(user_games: [:playbook]) + game = game.id |> Game.Context.get_game!() |> Repo.preload(user_games: [:playbook]) bot_user_game = Enum.find(game.user_games, fn user_game -> user_game.user_id == bot.id end) assert Helpers.get_first_player(game).editor_text == "tes" diff --git a/services/app/apps/codebattle/test/codebattle/bot/playbook_store_test.exs b/services/app/apps/codebattle/test/codebattle/bot/playbook_store_test.exs index 4a28a1398..247dd06fa 100644 --- a/services/app/apps/codebattle/test/codebattle/bot/playbook_store_test.exs +++ b/services/app/apps/codebattle/test/codebattle/bot/playbook_store_test.exs @@ -1,8 +1,8 @@ defmodule Codebattle.PlaybookStoreTest do use Codebattle.IntegrationCase - alias CodebattleWeb.{GameChannel, UserSocket} alias Codebattle.Playbook + alias CodebattleWeb.GameChannel # alias Codebattle.Repo alias CodebattleWeb.UserSocket @@ -128,7 +128,7 @@ defmodule Codebattle.PlaybookStoreTest do check_result: %{output: "", result: ""}, editor_lang: "js", editor_text: - "const _ = require(\"lodash\");\nconst R = require(\"rambda\");\n\nconst solution = (a, b) => {\n return 0;\n};\n// use stdout to debug\n\nmodule.exports = solution;", + ~s|const _ = require("lodash");\nconst R = require("rambda");\n\nconst solution = (a, b) => {\n return 0;\n};\n// use stdout to debug\n\nmodule.exports = solution;|, id: ^user2_id, name: "second", record_id: 1, @@ -140,7 +140,7 @@ defmodule Codebattle.PlaybookStoreTest do check_result: %{output: "", result: ""}, editor_lang: "js", editor_text: - "const _ = require(\"lodash\");\nconst R = require(\"rambda\");\n\nconst solution = (a, b) => {\n return 0;\n};\n// use stdout to debug\n\nmodule.exports = solution;", + ~s|const _ = require("lodash");\nconst R = require("rambda");\n\nconst solution = (a, b) => {\n return 0;\n};\n// use stdout to debug\n\nmodule.exports = solution;|, id: ^user1_id, name: "first", record_id: 0, @@ -150,7 +150,7 @@ defmodule Codebattle.PlaybookStoreTest do check_result: %{output: "", result: ""}, editor_lang: "js", editor_text: - "const _ = require(\"lodash\");\nconst R = require(\"rambda\");\n\nconst solution = (a, b) => {\n return 0;\n};\n// use stdout to debug\n\nmodule.exports = solution;", + ~s|const _ = require("lodash");\nconst R = require("rambda");\n\nconst solution = (a, b) => {\n return 0;\n};\n// use stdout to debug\n\nmodule.exports = solution;|, id: ^user2_id, name: "second", record_id: 1, diff --git a/services/app/apps/codebattle/test/codebattle/chat_test.exs b/services/app/apps/codebattle/test/codebattle/chat_test.exs index 568f67831..b4fef7abe 100644 --- a/services/app/apps/codebattle/test/codebattle/chat_test.exs +++ b/services/app/apps/codebattle/test/codebattle/chat_test.exs @@ -2,6 +2,7 @@ defmodule Codebattle.ChatTest do use Codebattle.DataCase alias Codebattle.Chat + alias Codebattle.Chat.Message @chat_type {:game, 198_419_841_984} @@ -22,7 +23,7 @@ defmodule Codebattle.ChatTest do Chat.add_message(@chat_type, %{type: :text, text: "oi", user_id: user_id, name: name}) assert [ - %Codebattle.Chat.Message{ + %Message{ id: 1, name: ^name, text: "oi", @@ -66,9 +67,9 @@ defmodule Codebattle.ChatTest do Chat.ban_user(@chat_type, %{admin_name: admin.name, user_id: user1.id, name: user1.name}) assert [ - %Codebattle.Chat.Message{id: 2, name: "bob", text: "blz", type: :text}, - %Codebattle.Chat.Message{id: 3, name: "admin", text: "bom", type: :text}, - %Codebattle.Chat.Message{id: 4, text: "alice has been banned by admin", type: :info} + %Message{id: 2, name: "bob", text: "blz", type: :text}, + %Message{id: 3, name: "admin", text: "bom", type: :text}, + %Message{id: 4, text: "alice has been banned by admin", type: :info} ] = Chat.get_messages(@chat_type) Chat.add_message(@chat_type, %{type: :text, text: "oi", user_id: user1.id, name: user1.name}) diff --git a/services/app/apps/codebattle/test/codebattle/code_check/output_parser_v2_test.exs b/services/app/apps/codebattle/test/codebattle/code_check/output_parser_v2_test.exs index 2fcd6ea3d..18b3358c7 100644 --- a/services/app/apps/codebattle/test/codebattle/code_check/output_parser_v2_test.exs +++ b/services/app/apps/codebattle/test/codebattle/code_check/output_parser_v2_test.exs @@ -1,11 +1,13 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do use CodebattleWeb.ConnCase, async: true - alias Codebattle.CodeCheck.Result - alias Codebattle.CodeCheck.OutputParser - import CodebattleWeb.Factory + alias Codebattle.CodeCheck.OutputParser + alias Codebattle.CodeCheck.Result + alias Codebattle.CodeCheck.Result.V2 + alias Codebattle.CodeCheck.Result.V2.AssertResult + @success_output """ {"type":"result","time":0.0076,"value":1,"output":"asdf"} {"type":"result","time":0.0076,"value":2,"output":"asdf"} @@ -35,7 +37,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do status: "failure", output_error: "pre_output", asserts: [ - %Result.V2.AssertResult{ + %AssertResult{ arguments: [1, 3], expected: 4, output: "Output", @@ -43,7 +45,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do execution_time: 0.1406, status: "failure" }, - %Result.V2.AssertResult{ + %AssertResult{ status: "success", execution_time: 0.0076, result: 1, @@ -51,7 +53,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do arguments: [1, 1], output: "asdf" }, - %Result.V2.AssertResult{ + %AssertResult{ status: "success", execution_time: 0.1234, result: 2, @@ -68,7 +70,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do status: "ok", success_count: 2, asserts: [ - %Result.V2.AssertResult{ + %AssertResult{ arguments: [1, 1], execution_time: 0.0076, expected: 1, @@ -76,7 +78,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do result: 1, status: "success" }, - %Result.V2.AssertResult{ + %AssertResult{ arguments: [2, 1], expected: 2, result: 2, @@ -93,7 +95,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do status: "ok", success_count: 1, asserts: [ - %Result.V2.AssertResult{ + %AssertResult{ status: "success", execution_time: 0.0076, result: 1, @@ -184,7 +186,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do exit_code: 2 }) - assert result == %Codebattle.CodeCheck.Result.V2{ + assert result == %V2{ asserts: [], exit_code: 2, asserts_count: 1, @@ -205,12 +207,11 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do exit_code: 143 }) - assert result == %Codebattle.CodeCheck.Result.V2{ + assert result == %V2{ asserts: [], exit_code: 143, asserts_count: 1, - output_error: - "Your solution was executed for longer than 15 seconds, try to write more optimally", + output_error: "Your solution was executed for longer than 15 seconds, try to write more optimally", status: "error", success_count: 0 } @@ -227,7 +228,7 @@ defmodule Codebattle.CodeCheck.OutputParser.V2Test do exit_code: 37 }) - assert %Codebattle.CodeCheck.Result.V2{ + assert %V2{ asserts: [], exit_code: 37, asserts_count: 1, diff --git a/services/app/apps/codebattle/test/codebattle/game/context_test.exs b/services/app/apps/codebattle/test/codebattle/game/context_test.exs index 26634b372..91bb95522 100644 --- a/services/app/apps/codebattle/test/codebattle/game/context_test.exs +++ b/services/app/apps/codebattle/test/codebattle/game/context_test.exs @@ -2,6 +2,7 @@ defmodule Codebattle.Game.ContextTest do use Codebattle.DataCase alias Codebattle.Game.Player + alias Codebattle.PubSub.Message describe "trigger_timeout/1" do setup do @@ -17,7 +18,7 @@ defmodule Codebattle.Game.ContextTest do {:ok, %{id: game_id, players: [%{id: user1_id}, %{id: user2_id}]}} = Game.Context.create_game(%{state: "playing", players: [user1, user2], level: "easy"}) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ event: "game:created", topic: "games", payload: _ @@ -28,7 +29,7 @@ defmodule Codebattle.Game.ContextTest do :ok = Game.Context.trigger_timeout(game_id) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ event: "game:finished", topic: "games", payload: %{ @@ -38,7 +39,7 @@ defmodule Codebattle.Game.ContextTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ event: "game:finished", topic: ^game_topic, payload: %{game_id: ^game_id, game_state: "timeout"} diff --git a/services/app/apps/codebattle/test/codebattle/game/tasks_queues_server_test.exs b/services/app/apps/codebattle/test/codebattle/game/tasks_queues_server_test.exs index 80ed6fb9d..1f06ad392 100644 --- a/services/app/apps/codebattle/test/codebattle/game/tasks_queues_server_test.exs +++ b/services/app/apps/codebattle/test/codebattle/game/tasks_queues_server_test.exs @@ -1,8 +1,8 @@ defmodule Codebattle.Game.TasksQueuesServerTest do use Codebattle.IntegrationCase - alias Codebattle.Task alias Codebattle.Game.TasksQueuesServer + alias Codebattle.Task test "gets next task" do tasks = insert_list(2, :task, level: "easy") @@ -29,11 +29,12 @@ defmodule Codebattle.Game.TasksQueuesServerTest do fetched_tasks = for _i <- 1..12, do: TasksQueuesServer.get_task("easy").id grouped_ids = - Enum.group_by(fetched_tasks, &Function.identity/1) + fetched_tasks + |> Enum.group_by(&Function.identity/1) |> Map.values() |> Enum.map(&Enum.count/1) assert 1 == grouped_ids |> Enum.uniq() |> Enum.count() - assert 4 == grouped_ids |> List.first() + assert 4 == List.first(grouped_ids) end end diff --git a/services/app/apps/codebattle/test/codebattle/tasks_importer_test.exs b/services/app/apps/codebattle/test/codebattle/tasks_importer_test.exs index 0b3045dbb..3d804ecf0 100644 --- a/services/app/apps/codebattle/test/codebattle/tasks_importer_test.exs +++ b/services/app/apps/codebattle/test/codebattle/tasks_importer_test.exs @@ -1,7 +1,8 @@ defmodule Codebattle.TasksImporterTest do use CodebattleWeb.ConnCase - alias Codebattle.{Repo, Task} + alias Codebattle.Repo + alias Codebattle.Task @root_dir File.cwd!() @@ -11,12 +12,11 @@ defmodule Codebattle.TasksImporterTest do issue_names = path |> File.ls!() - |> Enum.map(fn file_name -> + |> MapSet.new(fn file_name -> file_name |> String.split(".") |> List.first() end) - |> MapSet.new() {:ok, %{path: path, issue_names: issue_names}} end @@ -30,8 +30,7 @@ defmodule Codebattle.TasksImporterTest do task_names = Task |> Repo.all() - |> Enum.map(fn task -> task.name end) - |> MapSet.new() + |> MapSet.new(fn task -> task.name end) assert MapSet.equal?(task_names, issue_names) end @@ -43,8 +42,7 @@ defmodule Codebattle.TasksImporterTest do task_names = Task |> Repo.all() - |> Enum.map(fn task -> task.name end) - |> MapSet.new() + |> MapSet.new(fn task -> task.name end) assert MapSet.equal?(task_names, issue_names) end @@ -72,9 +70,9 @@ defmodule Codebattle.TasksImporterTest do path = Path.join(@root_dir, "test/support/fixtures/issues_with_disabled") Codebattle.TasksImporter.upsert([path]) - assert Repo.all(Task) |> Enum.count() == 2 + assert Task |> Repo.all() |> Enum.count() == 2 - assert Repo.all(Task.visible(Task)) |> Enum.count() == 1 + assert Task |> Task.visible() |> Repo.all() |> Enum.count() == 1 end test "update fields", %{path: path} do @@ -93,7 +91,7 @@ defmodule Codebattle.TasksImporterTest do assert task.creator_id == nil assert task.input_signature == [%{argument_name: "num", type: %{name: "integer"}}] assert task.output_signature == %{type: %{name: "integer"}} - assert task.asserts |> Enum.count() == 20 + assert Enum.count(task.asserts) == 20 Codebattle.TasksImporter.upsert([new_path]) @@ -112,7 +110,7 @@ defmodule Codebattle.TasksImporterTest do ] assert updated.output_signature == %{type: %{name: "string"}} - assert updated.asserts |> Enum.count() == 1 + assert Enum.count(updated.asserts) == 1 assert updated.id == task.id end end diff --git a/services/app/apps/codebattle/test/codebattle/tournament/arena_test.exs b/services/app/apps/codebattle/test/codebattle/tournament/arena_test.exs index b6ddf2864..97cd308ad 100644 --- a/services/app/apps/codebattle/test/codebattle/tournament/arena_test.exs +++ b/services/app/apps/codebattle/test/codebattle/tournament/arena_test.exs @@ -1,10 +1,10 @@ defmodule Codebattle.Tournament.ArenaTest do use Codebattle.DataCase, async: false - alias Codebattle.Tournament - import Codebattle.Tournament.Helpers + alias Codebattle.Tournament + setup do tasks = insert_list(3, :task, level: "easy") insert(:task_pack, name: "tp", task_ids: Enum.map(tasks, & &1.id)) diff --git a/services/app/apps/codebattle/test/codebattle/tournament/entire/arena_clan_seq_task_win_loss_test.exs b/services/app/apps/codebattle/test/codebattle/tournament/entire/arena_clan_seq_task_win_loss_test.exs index 668c01345..7fcff31b4 100644 --- a/services/app/apps/codebattle/test/codebattle/tournament/entire/arena_clan_seq_task_win_loss_test.exs +++ b/services/app/apps/codebattle/test/codebattle/tournament/entire/arena_clan_seq_task_win_loss_test.exs @@ -1,15 +1,16 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do use Codebattle.DataCase, async: false + import Codebattle.Tournament.Helpers + import Codebattle.TournamentTestHelpers + alias Codebattle.Event.EventClanResult alias Codebattle.Event.EventResult + alias Codebattle.PubSub.Message alias Codebattle.Repo alias Codebattle.Tournament alias Codebattle.Tournament.TournamentResult - import Codebattle.Tournament.Helpers - import Codebattle.TournamentTestHelpers - @decimal100 Decimal.new("100.0") test "works with several players and single round" do @@ -63,7 +64,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do Tournament.Server.handle_event(tournament.id, :join, %{users: users}) Enum.each(users, fn %{id: id, name: name} -> - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:player:joined", payload: %{player: %{name: ^name, id: ^id, state: "active"}} @@ -78,7 +79,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do min_time_sec: 0 }) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -92,7 +93,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_created", payload: %{ @@ -106,7 +107,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:match_created", payload: %{ @@ -123,7 +124,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:match_created", payload: %{ @@ -175,7 +176,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -184,7 +185,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:matchmaking_started", payload: %{ @@ -216,7 +217,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -225,7 +226,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:matchmaking_started", payload: %{ @@ -252,7 +253,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do players = Tournament.Players.get_players(tournament, "matchmaking_active") assert Enum.empty?(players) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:match_created", payload: %{ @@ -269,7 +270,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:match_created", payload: %{ @@ -308,13 +309,13 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:matchmaking_started", payload: %{ @@ -345,7 +346,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do players = Tournament.Players.get_players(tournament, "matchmaking_active") assert Enum.empty?(players) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:match_created", payload: %{ @@ -379,7 +380,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:matchmaking_stopped", payload: %{ @@ -394,7 +395,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{state: "game_over"}} @@ -410,7 +411,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do Tournament.Server.finish_round_after(tournament.id, tournament.current_round_position, 0) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:ended", payload: %{ @@ -425,7 +426,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:ended", payload: %{ @@ -440,7 +441,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -449,7 +450,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_finished", payload: %{ @@ -465,7 +466,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -481,7 +482,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:finished", payload: %{ @@ -497,7 +498,7 @@ defmodule Codebattle.Tournament.Entire.ArenaClanSeqTaskWinLossTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ diff --git a/services/app/apps/codebattle/test/codebattle/tournament/entire/arena_personal_with_clan_seq_task_95_percentile_test.exs b/services/app/apps/codebattle/test/codebattle/tournament/entire/arena_personal_with_clan_seq_task_95_percentile_test.exs index c55ced96e..1de68011c 100644 --- a/services/app/apps/codebattle/test/codebattle/tournament/entire/arena_personal_with_clan_seq_task_95_percentile_test.exs +++ b/services/app/apps/codebattle/test/codebattle/tournament/entire/arena_personal_with_clan_seq_task_95_percentile_test.exs @@ -1,15 +1,16 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest do use Codebattle.DataCase, async: false + import Codebattle.Tournament.Helpers + import Codebattle.TournamentTestHelpers + alias Codebattle.Event.EventResult + alias Codebattle.PubSub.Message alias Codebattle.Repo alias Codebattle.Tournament alias Codebattle.Tournament.Ranking.UpdateFromResultsServer alias Codebattle.Tournament.TournamentResult - import Codebattle.Tournament.Helpers - import Codebattle.TournamentTestHelpers - @tag :skip test "works with several players and single round" do [%{id: t1_id}, %{id: t2_id}, %{id: t3_id}] = insert_list(3, :task, level: "easy") @@ -79,7 +80,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest Tournament.Server.handle_event(tournament.id, :join, %{users: users}) Enum.each(users, fn %{id: id, name: name} -> - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:player:joined", payload: %{player: %{name: ^name, id: ^id, state: "active"}} @@ -94,7 +95,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest min_time_sec: 0 }) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -108,7 +109,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_created", payload: %{ @@ -122,7 +123,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:match_created", payload: %{ @@ -139,7 +140,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:match_created", payload: %{ @@ -196,7 +197,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -205,7 +206,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:matchmaking_started", payload: %{ @@ -241,7 +242,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -250,7 +251,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:matchmaking_started", payload: %{ @@ -278,7 +279,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest players = Tournament.Players.get_players(tournament, "matchmaking_active") assert Enum.empty?(players) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:match_created", payload: %{ @@ -295,7 +296,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:match_created", payload: %{ @@ -338,13 +339,13 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:matchmaking_started", payload: %{ @@ -380,7 +381,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest players = Tournament.Players.get_players(tournament, "matchmaking_active") assert Enum.empty?(players) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:match_created", payload: %{ @@ -418,7 +419,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:matchmaking_stopped", payload: %{ @@ -433,7 +434,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{state: "game_over"}} @@ -451,7 +452,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest Tournament.Server.finish_round_after(tournament.id, tournament.current_round_position, 0) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:matchmaking_stopped", payload: %{ @@ -466,7 +467,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -475,7 +476,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_finished", payload: %{ @@ -491,7 +492,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -507,7 +508,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -528,7 +529,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest Tournament.Server.stop_round_break_after(tournament.id, tournament.current_round_position, 0) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_created", payload: %{ @@ -542,7 +543,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:match_created", payload: %{ @@ -559,7 +560,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:match_created", payload: %{ @@ -576,7 +577,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -626,7 +627,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -635,7 +636,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:matchmaking_started", payload: %{ @@ -671,7 +672,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -680,7 +681,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:matchmaking_started", payload: %{ @@ -709,7 +710,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest min_time_with_played_sec: 1000 }) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:match_created", payload: %{ @@ -726,7 +727,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:match_created", payload: %{ @@ -751,13 +752,13 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest win_active_match(tournament, user1) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:matchmaking_stopped", payload: %{ @@ -795,7 +796,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest Tournament.Server.finish_round_after(tournament.id, tournament.current_round_position, 0) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:matchmaking_stopped", payload: %{ @@ -810,7 +811,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -819,7 +820,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_finished", payload: %{ @@ -835,7 +836,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -851,7 +852,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -872,7 +873,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest Tournament.Server.stop_round_break_after(tournament.id, tournament.current_round_position, 0) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_created", payload: %{ @@ -886,7 +887,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:player:match_created", payload: %{ @@ -903,7 +904,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:match_created", payload: %{ @@ -920,7 +921,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -968,7 +969,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest ] } = Tournament.Ranking.get_page(tournament, 1) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -977,7 +978,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:player:matchmaking_stopped", payload: %{ @@ -1000,7 +1001,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest Tournament.Server.finish_round_after(tournament.id, tournament.current_round_position, 0) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "waiting_room:ended", payload: %{ @@ -1015,7 +1016,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "waiting_room:ended", payload: %{ @@ -1030,7 +1031,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -1039,7 +1040,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_finished", payload: %{ @@ -1055,7 +1056,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -1071,7 +1072,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -1085,7 +1086,7 @@ defmodule Codebattle.Tournament.Entire.ArenaPersonalWithClanSeqTask95PercentTest } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:finished", payload: %{ diff --git a/services/app/apps/codebattle/test/codebattle/tournament/entire/squad_seq_task_one_zero_test.exs b/services/app/apps/codebattle/test/codebattle/tournament/entire/squad_seq_task_one_zero_test.exs index aeaa9e9af..31d7282c8 100644 --- a/services/app/apps/codebattle/test/codebattle/tournament/entire/squad_seq_task_one_zero_test.exs +++ b/services/app/apps/codebattle/test/codebattle/tournament/entire/squad_seq_task_one_zero_test.exs @@ -1,11 +1,12 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do use Codebattle.DataCase, async: false - alias Codebattle.Tournament - import Codebattle.Tournament.Helpers import Codebattle.TournamentTestHelpers + alias Codebattle.PubSub.Message + alias Codebattle.Tournament + test "works with several players and single round" do [%{id: t1_id}, %{id: t2_id}] = insert_list(2, :task, level: "easy") [%{id: t3_id}, %{id: t4_id}] = insert_list(2, :task, level: "medium") @@ -58,7 +59,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do Tournament.Server.handle_event(tournament.id, :join, %{users: users}) Enum.each(users, fn %{id: id, name: name} -> - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:player:joined", payload: %{player: %{name: ^name, id: ^id, state: "active"}} @@ -73,7 +74,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do min_time_sec: 0 }) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -87,7 +88,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_created", payload: %{ @@ -101,7 +102,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -114,7 +115,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -127,7 +128,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{ @@ -140,7 +141,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{ @@ -165,13 +166,13 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user1) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{id: 0, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{match: %{id: 0, state: "game_over"}, players: [%{}, %{}]} @@ -183,19 +184,19 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user3) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{match: %{id: 1, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{match: %{id: 1, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -209,7 +210,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -218,7 +219,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -227,7 +228,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{ @@ -236,7 +237,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{ @@ -255,13 +256,13 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user1) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{id: 2, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{match: %{id: 2, state: "game_over"}, players: [%{}, %{}]} @@ -275,19 +276,19 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user3) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{match: %{id: 3, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{match: %{id: 3, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_finished", payload: %{ @@ -303,7 +304,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -319,7 +320,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -352,7 +353,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do Tournament.Server.stop_round_break_after(tournament.id, tournament.current_round_position, 0) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_created", payload: %{ @@ -366,7 +367,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -375,7 +376,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -384,7 +385,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{ @@ -393,7 +394,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{ @@ -402,7 +403,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -422,7 +423,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user1) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -431,7 +432,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -446,7 +447,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user3) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{ @@ -455,7 +456,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{ @@ -464,7 +465,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -478,7 +479,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -487,7 +488,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -496,7 +497,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{ @@ -505,7 +506,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{ @@ -524,13 +525,13 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user1) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{id: 6, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{match: %{id: 6, state: "game_over"}, players: [%{}, %{}]} @@ -544,19 +545,19 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user3) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{match: %{id: 7, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{match: %{id: 7, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_finished", payload: %{ @@ -572,7 +573,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -588,7 +589,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -618,7 +619,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do Tournament.Server.stop_round_break_after(tournament.id, tournament.current_round_position, 0) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_created", payload: %{ @@ -632,7 +633,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -641,7 +642,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -650,7 +651,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{ @@ -659,7 +660,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{ @@ -668,7 +669,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -688,13 +689,13 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user1) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{id: 8, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{match: %{id: 8, state: "game_over"}, players: [%{}, %{}]} @@ -706,19 +707,19 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user3) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{match: %{id: 9, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{match: %{id: 9, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -732,7 +733,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{ @@ -741,7 +742,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{ @@ -750,7 +751,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{ @@ -759,7 +760,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{ @@ -778,13 +779,13 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user1) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player1_topic, event: "tournament:match:upserted", payload: %{match: %{id: 10, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player2_topic, event: "tournament:match:upserted", payload: %{match: %{id: 10, state: "game_over"}, players: [%{}, %{}]} @@ -798,19 +799,19 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do win_active_match(tournament, user3) :timer.sleep(100) - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player3_topic, event: "tournament:match:upserted", payload: %{match: %{id: 11, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^player4_topic, event: "tournament:match:upserted", payload: %{match: %{id: 11, state: "game_over"}, players: [%{}, %{}]} } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:round_finished", payload: %{ @@ -826,7 +827,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -842,7 +843,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^admin_topic, event: "tournament:updated", payload: %{ @@ -858,7 +859,7 @@ defmodule Codebattle.Tournament.Entire.SquadSeqTaskOneZeroTest do } } - assert_received %Codebattle.PubSub.Message{ + assert_received %Message{ topic: ^common_topic, event: "tournament:finished", payload: %{ diff --git a/services/app/apps/codebattle/test/codebattle/tournament/team_test.exs b/services/app/apps/codebattle/test/codebattle/tournament/team_test.exs index 1295fca71..cb28da20f 100644 --- a/services/app/apps/codebattle/test/codebattle/tournament/team_test.exs +++ b/services/app/apps/codebattle/test/codebattle/tournament/team_test.exs @@ -1,10 +1,10 @@ defmodule Codebattle.Tournament.TeamTest do use Codebattle.DataCase, async: false - alias Codebattle.Tournament - import Codebattle.Tournament.Helpers + alias Codebattle.Tournament + setup do insert(:task, level: "elementary", name: "2") diff --git a/services/app/apps/codebattle/test/codebattle/user/rank_update_test.exs b/services/app/apps/codebattle/test/codebattle/user/rank_update_test.exs index ff9473b6e..488cea339 100644 --- a/services/app/apps/codebattle/test/codebattle/user/rank_update_test.exs +++ b/services/app/apps/codebattle/test/codebattle/user/rank_update_test.exs @@ -17,19 +17,11 @@ defmodule Codebattle.User.RankUpdateTest do User |> Repo.all() |> Enum.filter(fn user -> !user.is_bot end) - |> Enum.map(fn user -> {user.id, user.rank} end) - |> MapSet.new() + |> MapSet.new(fn user -> {user.id, user.rank} end) assert MapSet.equal?( ranks, - [ - {user1.id, 1}, - {user2.id, 2}, - {user3.id, 3}, - {user4.id, 3}, - {user5.id, 4} - ] - |> MapSet.new() + MapSet.new([{user1.id, 1}, {user2.id, 2}, {user3.id, 3}, {user4.id, 3}, {user5.id, 4}]) ) # add new user @@ -42,20 +34,11 @@ defmodule Codebattle.User.RankUpdateTest do User |> Repo.all() |> Enum.filter(fn user -> !user.is_bot end) - |> Enum.map(fn user -> {user.id, user.rank} end) - |> MapSet.new() + |> MapSet.new(fn user -> {user.id, user.rank} end) assert MapSet.equal?( ranks, - [ - {user1.id, 1}, - {user2.id, 2}, - {user6.id, 3}, - {user3.id, 3}, - {user4.id, 3}, - {user5.id, 4} - ] - |> MapSet.new() + MapSet.new([{user1.id, 1}, {user2.id, 2}, {user6.id, 3}, {user3.id, 3}, {user4.id, 3}, {user5.id, 4}]) ) # rating has been updated @@ -79,20 +62,11 @@ defmodule Codebattle.User.RankUpdateTest do |> Repo.all() |> Enum.filter(fn user -> !user.is_bot end) |> Enum.sort_by(fn user -> !user.is_bot end) - |> Enum.map(fn user -> {user.id, user.rank} end) - |> MapSet.new() + |> MapSet.new(fn user -> {user.id, user.rank} end) assert MapSet.equal?( ranks, - [ - {user6.id, 1}, - {user5.id, 2}, - {user2.id, 3}, - {user3.id, 4}, - {user4.id, 4}, - {user1.id, 5} - ] - |> MapSet.new() + MapSet.new([{user6.id, 1}, {user5.id, 2}, {user2.id, 3}, {user3.id, 4}, {user4.id, 4}, {user1.id, 5}]) ) end end diff --git a/services/app/apps/codebattle/test/codebattle/user/scope_test.exs b/services/app/apps/codebattle/test/codebattle/user/scope_test.exs index dfe2f3563..c3a2e008d 100644 --- a/services/app/apps/codebattle/test/codebattle/user/scope_test.exs +++ b/services/app/apps/codebattle/test/codebattle/user/scope_test.exs @@ -16,7 +16,7 @@ defmodule Codebattle.User.ScopeTest do params = %{"q" => %{"name_ilike" => "first"}} query = Scope.list_users(params) - [result] = query |> Repo.all() + [result] = Repo.all(query) assert user1.id == result.id end diff --git a/services/app/apps/codebattle/test/codebattle/waiting_room/enginge_test.exs b/services/app/apps/codebattle/test/codebattle/waiting_room/enginge_test.exs index 26c0c21e3..26e7a694b 100644 --- a/services/app/apps/codebattle/test/codebattle/waiting_room/enginge_test.exs +++ b/services/app/apps/codebattle/test/codebattle/waiting_room/enginge_test.exs @@ -11,7 +11,7 @@ defmodule Codebattle.WaitingRoom.EngineTest do pair_with_bot = now - 21 players = - [ + Enum.shuffle([ %{id: 1, tasks: 1, score: 1, wr_joined_at: joined, clan_id: 1}, %{id: 2, tasks: 1, score: 4, wr_joined_at: joined, clan_id: 1}, %{id: 3, tasks: 1, score: 3, wr_joined_at: joined, clan_id: 2}, @@ -28,8 +28,7 @@ defmodule Codebattle.WaitingRoom.EngineTest do %{id: 14, tasks: 7, score: 9, wr_joined_at: pair_with_same_opponent, clan_id: 5}, %{id: 15, tasks: 7, score: 9, wr_joined_at: pair_with_same_opponent, clan_id: 6}, %{id: 16, tasks: 8, score: 9, wr_joined_at: pair_with_bot, clan_id: 6} - ] - |> Enum.shuffle() + ]) state = %State{ name: "wr", diff --git a/services/app/apps/codebattle/test/codebattle_web/channels/chat_channel_test.exs b/services/app/apps/codebattle/test/codebattle_web/channels/chat_channel_test.exs index 1b401ed99..6d55e3ead 100644 --- a/services/app/apps/codebattle/test/codebattle_web/channels/chat_channel_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/channels/chat_channel_test.exs @@ -1,9 +1,10 @@ defmodule CodebattleWeb.ChatChannelTest do use CodebattleWeb.ChannelCase, async: true - alias CodebattleWeb.ChatChannel alias Codebattle.Chat + alias CodebattleWeb.ChatChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user, name: "alice") @@ -19,8 +20,7 @@ defmodule CodebattleWeb.ChatChannelTest do admin_token = Phoenix.Token.sign(socket(UserSocket), "user_token", admin.id) {:ok, admin_socket} = connect(UserSocket, %{"token" => admin_token}) - {:ok, - %{user1: user1, user2: user2, socket1: socket1, socket2: socket2, admin_socket: admin_socket}} + {:ok, %{user1: user1, user2: user2, socket1: socket1, socket2: socket2, admin_socket: admin_socket}} end test "sends chat info when user join", %{user1: user1, socket1: socket1} do @@ -40,7 +40,7 @@ defmodule CodebattleWeb.ChatChannelTest do chat_topic = get_chat_topic(chat_id) {:ok, _response, _socket2} = subscribe_and_join(socket2, ChatChannel, chat_topic) - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ topic: ^chat_topic, event: "chat:user_joined", payload: response @@ -95,7 +95,7 @@ defmodule CodebattleWeb.ChatChannelTest do Process.unlink(socket2.channel_pid) :timer.sleep(100) - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ topic: ^chat_topic, event: "chat:user_left", payload: response diff --git a/services/app/apps/codebattle/test/codebattle_web/channels/game_channel_test.exs b/services/app/apps/codebattle/test/codebattle_web/channels/game_channel_test.exs index a10ebb129..9b42e0a0c 100644 --- a/services/app/apps/codebattle/test/codebattle_web/channels/game_channel_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/channels/game_channel_test.exs @@ -5,6 +5,8 @@ defmodule CodebattleWeb.GameChannelTest do alias Codebattle.Game.Player alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast + alias Phoenix.Socket.Reply setup do user1 = insert(:user, rating: 1001) @@ -65,25 +67,25 @@ defmodule CodebattleWeb.GameChannelTest do payload3 = %{user_id: user1.id, editor_text: editor_text1, lang_slug: editor_lang1} payload4 = %{user_id: user2.id, editor_text: editor_text2, lang_slug: editor_lang2} - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ topic: ^game_topic, event: "editor:data", payload: ^payload1 } - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ topic: ^game_topic, event: "editor:data", payload: ^payload2 } - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ topic: ^game_topic, event: "editor:data", payload: ^payload3 } - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ topic: ^game_topic, event: "editor:data", payload: ^payload4 @@ -115,7 +117,7 @@ defmodule CodebattleWeb.GameChannelTest do assert Game.Helpers.gave_up?(game, user1.id) == true assert Game.Helpers.winner?(game, user2.id) == true - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ topic: ^game_topic, event: "user:give_up", payload: payload @@ -134,7 +136,7 @@ defmodule CodebattleWeb.GameChannelTest do push(socket1, "editor:data", %{editor_text: "oi", lang_slug: "js"}) - assert_receive %Phoenix.Socket.Reply{ + assert_receive %Reply{ topic: ^game_topic, payload: %{reason: :game_is_dead} } @@ -155,7 +157,7 @@ defmodule CodebattleWeb.GameChannelTest do user1_id = user1.id push(socket1, "game:score", %{}) - assert_receive %Phoenix.Socket.Reply{ + assert_receive %Reply{ topic: ^game_topic, payload: %{score: %{game_results: [%{}], player_results: %{}, winner_id: ^user1_id}} } diff --git a/services/app/apps/codebattle/test/codebattle_web/channels/invite_channel_test.exs b/services/app/apps/codebattle/test/codebattle_web/channels/invite_channel_test.exs index 4e3f4402b..862f95dff 100644 --- a/services/app/apps/codebattle/test/codebattle_web/channels/invite_channel_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/channels/invite_channel_test.exs @@ -3,6 +3,8 @@ defmodule CodebattleWeb.InviteChannelTest do alias CodebattleWeb.InviteChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Message + alias Phoenix.Socket.Reply setup do creator = insert(:user) @@ -29,7 +31,7 @@ defmodule CodebattleWeb.InviteChannelTest do assert response == %{} - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ topic: "invites", event: "invites:init", payload: response @@ -50,7 +52,7 @@ defmodule CodebattleWeb.InviteChannelTest do assert response == %{} - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ topic: "invites", event: "invites:init", payload: response @@ -73,7 +75,7 @@ defmodule CodebattleWeb.InviteChannelTest do response_ref = push(creator_socket, "invites:create", %{recipient_id: recipient.id}) - assert_receive %Phoenix.Socket.Reply{ + assert_receive %Reply{ topic: "invites", ref: ^response_ref, payload: response @@ -83,7 +85,7 @@ defmodule CodebattleWeb.InviteChannelTest do assert response.invite.creator_id == creator.id assert response.invite.recipient_id == recipient.id - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ topic: "invites", event: "invites:created", payload: response @@ -110,7 +112,7 @@ defmodule CodebattleWeb.InviteChannelTest do response_ref = push(recipient_socket, "invites:accept", %{"id" => invite.id}) - assert_receive %Phoenix.Socket.Reply{ + assert_receive %Reply{ topic: "invites", ref: ^response_ref, payload: response @@ -121,7 +123,7 @@ defmodule CodebattleWeb.InviteChannelTest do assert response.invite.creator_id == creator.id assert response.invite.recipient_id == recipient.id - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ topic: "invites", payload: _response } @@ -145,7 +147,7 @@ defmodule CodebattleWeb.InviteChannelTest do recipient_response_ref = push(recipient_socket, "invites:cancel", %{"id" => creator_invite.id}) - assert_receive %Phoenix.Socket.Reply{ + assert_receive %Reply{ topic: "invites", ref: ^recipient_response_ref, payload: response @@ -156,7 +158,7 @@ defmodule CodebattleWeb.InviteChannelTest do assert response.invite.creator_id == creator.id assert response.invite.recipient_id == recipient.id - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ topic: "invites", payload: _response } @@ -164,7 +166,7 @@ defmodule CodebattleWeb.InviteChannelTest do ## Creator cancels invite creator_response_ref = push(creator_socket, "invites:cancel", %{"id" => recipient_invite.id}) - assert_receive %Phoenix.Socket.Reply{ + assert_receive %Reply{ topic: "invites", ref: ^creator_response_ref, payload: response @@ -175,7 +177,7 @@ defmodule CodebattleWeb.InviteChannelTest do assert response.invite.creator_id == creator.id assert response.invite.recipient_id == recipient.id - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ topic: "invites", payload: _response } diff --git a/services/app/apps/codebattle/test/codebattle_web/channels/lobby_channel_test.exs b/services/app/apps/codebattle/test/codebattle_web/channels/lobby_channel_test.exs index 2588b29b1..1bafe2a31 100644 --- a/services/app/apps/codebattle/test/codebattle_web/channels/lobby_channel_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/channels/lobby_channel_test.exs @@ -3,9 +3,10 @@ defmodule CodebattleWeb.LobbyChannelTest do import ExUnit.CaptureIO + alias Codebattle.Game alias CodebattleWeb.LobbyChannel alias CodebattleWeb.UserSocket - alias Codebattle.Game + alias Phoenix.Socket.Message test "sends game info when user join" do task = insert(:task) @@ -44,7 +45,7 @@ defmodule CodebattleWeb.LobbyChannelTest do push(socket, "game:create", %{opponent_type: "other_user", level: "elementary"}) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "game:upsert" } end @@ -60,7 +61,7 @@ defmodule CodebattleWeb.LobbyChannelTest do push(socket, "game:create", %{opponent_type: "bot", level: "elementary"}) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "game:upsert" } end @@ -90,7 +91,7 @@ defmodule CodebattleWeb.LobbyChannelTest do task_id: task1.id }) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "game:upsert", payload: %{game: %{id: game_id}} } @@ -110,7 +111,7 @@ defmodule CodebattleWeb.LobbyChannelTest do task_id: task1.id }) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "game:upsert", payload: %{game: %{id: game_id}} } @@ -146,7 +147,7 @@ defmodule CodebattleWeb.LobbyChannelTest do task_tags: ["lol"] }) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "game:upsert", payload: %{game: %{id: game_id}} } @@ -166,7 +167,7 @@ defmodule CodebattleWeb.LobbyChannelTest do task_tags: ["lol"] }) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "game:upsert", payload: %{game: %{id: game_id}} } @@ -186,7 +187,7 @@ defmodule CodebattleWeb.LobbyChannelTest do task_tags: ["kek"] }) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "game:upsert", payload: %{game: %{id: game_id}} } diff --git a/services/app/apps/codebattle/test/codebattle_web/channels/main_channel_test.exs b/services/app/apps/codebattle/test/codebattle_web/channels/main_channel_test.exs index 9b1f8d2a6..802f5abe9 100644 --- a/services/app/apps/codebattle/test/codebattle_web/channels/main_channel_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/channels/main_channel_test.exs @@ -1,10 +1,12 @@ defmodule CodebattleWeb.MainChannelTest do use CodebattleWeb.ChannelCase + alias Codebattle.Game alias CodebattleWeb.MainChannel - alias CodebattleWeb.UserSocket alias CodebattleWeb.Presence - alias Codebattle.Game + alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Message + alias Phoenix.Socket.Reply setup do creator = insert(:user) @@ -32,7 +34,7 @@ defmodule CodebattleWeb.MainChannelTest do list = Presence.list(socket) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ topic: "main", event: "presence_state", payload: payload @@ -77,14 +79,14 @@ defmodule CodebattleWeb.MainChannelTest do push(socket, "user:follow", %{user_id: user.id + 1}) - assert_receive %Phoenix.Socket.Reply{ + assert_receive %Reply{ topic: "main", payload: %{active_game_id: nil} } push(socket, "user:follow", %{user_id: user.id}) - assert_receive %Phoenix.Socket.Reply{ + assert_receive %Reply{ topic: "main", payload: %{active_game_id: ^game_id} } @@ -92,7 +94,7 @@ defmodule CodebattleWeb.MainChannelTest do Game.Context.create_game(%{players: [user]}) :timer.sleep(100) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ topic: "main", event: "user:game_created", payload: %{active_game_id: _} @@ -103,7 +105,7 @@ defmodule CodebattleWeb.MainChannelTest do Game.Context.create_game(%{players: [user]}) :timer.sleep(100) - refute_receive %Phoenix.Socket.Message{ + refute_receive %Message{ topic: "main", event: "user:game_created", payload: %{active_game_id: _} diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/activity_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/activity_controller_test.exs index 59c0179d3..669e9fe2e 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/activity_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/activity_controller_test.exs @@ -16,7 +16,8 @@ defmodule CodebattleWeb.Api.V1.ActivityControllerTest do %{"count" => 2, "date" => "2000-01-01"} ] - assert json_response(conn, 200) + assert conn + |> json_response(200) |> Map.get("activities") |> Enum.sort(&(Map.get(&1, "count") >= Map.get(&2, "count"))) == asserted_data end diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/game_activity_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/game_activity_controller_test.exs index 5ba6b39c1..d7cadd0e1 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/game_activity_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/game_activity_controller_test.exs @@ -5,16 +5,15 @@ defmodule CodebattleWeb.Api.V1.GameActivityControllerTest do insert_list(3, :game, inserted_at: ~N[2000-01-02 22:00:07]) insert_list(2, :game, inserted_at: ~N[2000-01-01 23:00:07]) - conn = - conn - |> get(Routes.api_v1_game_activity_path(conn, :show)) + conn = get(conn, Routes.api_v1_game_activity_path(conn, :show)) asserted_data = [ %{"count" => 3, "date" => "2000-01-02"}, %{"count" => 2, "date" => "2000-01-01"} ] - assert json_response(conn, 200) + assert conn + |> json_response(200) |> Map.get("activities") |> Enum.sort(&(Map.get(&1, "count") >= Map.get(&2, "count"))) == asserted_data end diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/game_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/game_controller_test.exs index 12ef7587b..65ea2c843 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/game_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/game_controller_test.exs @@ -66,9 +66,7 @@ defmodule CodebattleWeb.Api.V1.GameControllerTest do resp_body = conn - |> get( - Routes.api_v1_game_path(conn, :completed, %{user_id: user1.id, page: 2, page_size: 1}) - ) + |> get(Routes.api_v1_game_path(conn, :completed, %{user_id: user1.id, page: 2, page_size: 1})) |> json_response(200) %{"games" => games, "page_info" => page_info} = resp_body diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/task_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/task_controller_test.exs index a5aea53a7..8366a682c 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/task_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/task_controller_test.exs @@ -62,9 +62,7 @@ defmodule CodebattleWeb.Api.V1.TaskControllerTest do test "shows visible task", %{conn: conn} do task = insert(:task, visibility: "public", level: "easy") - conn = - conn - |> get(Routes.api_v1_task_path(conn, :show, task.id)) + conn = get(conn, Routes.api_v1_task_path(conn, :show, task.id)) resp_body = json_response(conn, 200) @@ -116,9 +114,7 @@ defmodule CodebattleWeb.Api.V1.TaskControllerTest do test "returns false when task exists", %{conn: conn} do task = insert(:task, visibility: "public", level: "easy", name: "task_name") - conn = - conn - |> get(Routes.api_v1_task_path(conn, :unique, task.name)) + conn = get(conn, Routes.api_v1_task_path(conn, :unique, task.name)) resp_body = json_response(conn, 200) @@ -126,9 +122,7 @@ defmodule CodebattleWeb.Api.V1.TaskControllerTest do end test "returns true when task not exists", %{conn: conn} do - conn = - conn - |> get(Routes.api_v1_task_path(conn, :unique, "my_unqiue_task")) + conn = get(conn, Routes.api_v1_task_path(conn, :unique, "my_unqiue_task")) resp_body = json_response(conn, 200) diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/user_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/user_controller_test.exs index 13068ccd4..20f9e67ae 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/user_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/user_controller_test.exs @@ -11,9 +11,7 @@ defmodule CodebattleWeb.Api.V1.UserControllerTest do insert(:user, %{name: "third", email: "test3@test.test", github_id: 3, rating: 2210}) insert(:user, %{name: "forth", email: "test4@test.test", github_id: 4, rating: 2210}) - conn = - conn - |> get(Routes.api_v1_user_path(conn, :index)) + conn = get(conn, Routes.api_v1_user_path(conn, :index)) resp_body = json_response(conn, 200) @@ -41,9 +39,7 @@ defmodule CodebattleWeb.Api.V1.UserControllerTest do insert(:user, %{name: "third", email: "test3@test.test", github_id: 3, rating: 2210}) insert(:user, %{name: "forth", email: "test4@test.test", github_id: 4, rating: 2210}) - conn = - conn - |> get(Routes.api_v1_user_path(conn, :index), %{"date_from" => date_from}) + conn = get(conn, Routes.api_v1_user_path(conn, :index), %{"date_from" => date_from}) resp_body = json_response(conn, 200) @@ -64,9 +60,7 @@ defmodule CodebattleWeb.Api.V1.UserControllerTest do insert(:user, %{name: "bbb", email: "test2@test.test", github_id: 2, rating: 2310}) insert(:user, %{name: "ab", email: "test3@test.test", github_id: 3, rating: 2210}) - conn = - conn - |> get(Routes.api_v1_user_path(conn, :index, q: %{name_ilike: "a"})) + conn = get(conn, Routes.api_v1_user_path(conn, :index, q: %{name_ilike: "a"})) resp_body = json_response(conn, 200) @@ -93,9 +87,7 @@ defmodule CodebattleWeb.Api.V1.UserControllerTest do } ) - conn = - conn - |> get(Routes.api_v1_user_path(conn, :index, s: "inserted_at+asc")) + conn = get(conn, Routes.api_v1_user_path(conn, :index, s: "inserted_at+asc")) resp_body = json_response(conn, 200) @@ -141,7 +133,7 @@ defmodule CodebattleWeb.Api.V1.UserControllerTest do %{"count" => 1, "lang" => "golang", "result" => "lost"}, %{"count" => 1, "lang" => "js", "result" => "won"}, %{"count" => 1, "lang" => "ruby", "result" => "lost"} - ] = resp_body["stats"]["all"] |> Enum.sort_by(& &1["lang"]) + ] = Enum.sort_by(resp_body["stats"]["all"], & &1["lang"]) assert %{ "active_game_id" => ^game4_id, diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/user_game_report_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/user_game_report_controller_test.exs index baf3e0bb9..da022e662 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/user_game_report_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/api/v1/user_game_report_controller_test.exs @@ -1,9 +1,9 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do use Codebattle.IntegrationCase - alias Codebattle.Repo - alias Codebattle.Game alias Codebattle.Bot + alias Codebattle.Game + alias Codebattle.Repo alias Codebattle.UserGameReport describe "create/1" do @@ -47,7 +47,7 @@ defmodule CodebattleWeb.Api.V1.UserGameReportControllerTest do assert offender_id == bot.id user_game_report = - UserGameReport.get!(user_game_report_id) |> Repo.preload([:reporter, :offender]) + user_game_report_id |> UserGameReport.get!() |> Repo.preload([:reporter, :offender]) assert user_game_report.state == :pending assert user_game_report.reporter.id == user.id diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/auth_bind_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/auth_bind_controller_test.exs index 80d9a9229..d91288b6b 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/auth_bind_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/auth_bind_controller_test.exs @@ -82,7 +82,7 @@ defmodule CodebattleWeb.AuthBindControllerTest do describe "DELETE /auth/:provider/" do test "unbinds discord", %{conn: conn} do user = insert(:user) - conn = conn |> put_session(:user_id, user.id) + conn = put_session(conn, :user_id, user.id) delete(conn, "/auth/discord") user = Repo.reload!(user) @@ -94,7 +94,7 @@ defmodule CodebattleWeb.AuthBindControllerTest do test "unbinds github", %{conn: conn} do user = insert(:user) - conn = conn |> put_session(:user_id, user.id) + conn = put_session(conn, :user_id, user.id) delete(conn, "/auth/github") user = Repo.reload!(user) diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/ext_api/user_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/ext_api/user_controller_test.exs index 0eb0b74ce..338d311c5 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/ext_api/user_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/ext_api/user_controller_test.exs @@ -15,9 +15,7 @@ defmodule CodebattleWeb.ExtApi.UserControllerTest do test "creates user with clan and auth token", %{conn: conn} do conn |> put_req_header("x-auth-key", "x-key") - |> post( - Routes.ext_api_user_path(conn, :create, %{name: "lol", clan: "kek", auth_token: "asdf"}) - ) + |> post(Routes.ext_api_user_path(conn, :create, %{name: "lol", clan: "kek", auth_token: "asdf"})) |> json_response(200) user = Repo.get_by(User, name: "lol") @@ -45,16 +43,12 @@ defmodule CodebattleWeb.ExtApi.UserControllerTest do test "creates user with existing name", %{conn: conn} do conn |> put_req_header("x-auth-key", "x-key") - |> post( - Routes.ext_api_user_path(conn, :create, %{name: "lol", clan: "kek", auth_token: "asdf"}) - ) + |> post(Routes.ext_api_user_path(conn, :create, %{name: "lol", clan: "kek", auth_token: "asdf"})) |> json_response(200) conn |> put_req_header("x-auth-key", "x-key") - |> post( - Routes.ext_api_user_path(conn, :create, %{name: "lol", clan: "kek", auth_token: "asdf"}) - ) + |> post(Routes.ext_api_user_path(conn, :create, %{name: "lol", clan: "kek", auth_token: "asdf"})) |> json_response(200) clan = Repo.get_by(Clan, name: "kek") @@ -68,9 +62,7 @@ defmodule CodebattleWeb.ExtApi.UserControllerTest do conn |> put_req_header("x-auth-key", "x-key") - |> post( - Routes.ext_api_user_path(conn, :create, %{name: "oiblz", clan: "Kek ", auth_token: "asdf"}) - ) + |> post(Routes.ext_api_user_path(conn, :create, %{name: "oiblz", clan: "Kek ", auth_token: "asdf"})) |> json_response(200) users = User |> Repo.all() |> Enum.filter(&(&1.id > 0)) diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/feedback_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/feedback_controller_test.exs index 74e7b9ef7..6916bd939 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/feedback_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/feedback_controller_test.exs @@ -2,9 +2,7 @@ defmodule CodebattleWeb.FeedbackControllerTest do use CodebattleWeb.ConnCase, async: true test "index user", %{conn: conn} do - conn = - conn - |> get(Routes.feedback_path(conn, :index)) + conn = get(conn, Routes.feedback_path(conn, :index)) assert conn.status == 200 end diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/game_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/game_controller_test.exs index 029e25a84..abda1dcbd 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/game_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/game_controller_test.exs @@ -2,6 +2,7 @@ defmodule CodebattleWeb.GameControllerTest do use CodebattleWeb.ConnCase, async: false import Ecto.Query, warn: false + alias Codebattle.Game describe "GET games/:id" do diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/image_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/image_controller_test.exs index a6590ce76..72b21ddcc 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/image_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/image_controller_test.exs @@ -10,9 +10,7 @@ defmodule CodebattleWeb.ImageControllerTest do game = insert(:game, level: "elementary", state: "playing", players: players) - conn = - conn - |> get(Routes.game_image_path(conn, :show, game.id)) + conn = get(conn, Routes.game_image_path(conn, :show, game.id)) assert conn.status == 200 assert conn.resp_body =~ user1.name @@ -26,9 +24,7 @@ defmodule CodebattleWeb.ImageControllerTest do game = insert(:game, level: "elementary", state: "waiting_opponent", players: players) - conn = - conn - |> get(Routes.game_image_path(conn, :show, game.id)) + conn = get(conn, Routes.game_image_path(conn, :show, game.id)) assert conn.status == 200 assert conn.resp_body =~ user1.name @@ -38,9 +34,7 @@ defmodule CodebattleWeb.ImageControllerTest do test "returns 200 without players", %{conn: conn} do game = insert(:game, level: "elementary", state: "init", players: []) - conn = - conn - |> get(Routes.game_image_path(conn, :show, game.id)) + conn = get(conn, Routes.game_image_path(conn, :show, game.id)) assert conn.status == 200 assert conn.resp_body =~ "game" diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/task_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/task_controller_test.exs index be3b19ba8..366f2b346 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/task_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/task_controller_test.exs @@ -125,10 +125,10 @@ defmodule CodebattleWeb.TaskControllerTest do "description_ru" => "проверка суммирования: для руби", "examples" => "```\n2 == solution(1,1)\n10 == solution(9,1)\n```", "input_signature" => - "[{\"argument_name\":\"a\",\"type\":{\"name\":\"integer\"}},{\"argument_name\":\"b\",\"type\":{\"name\":\"integer\"}}]", + ~s([{"argument_name":"a","type":{"name":"integer"}},{"argument_name":"b","type":{"name":"integer"}}]), "level" => "hard", "name" => "mega_task", - "output_signature" => "{\"type\":{\"name\":\"string\"}}", + "output_signature" => ~s({"type":{"name":"string"}}), "tags" => " kek,lol" } diff --git a/services/app/apps/codebattle/test/codebattle_web/controllers/user_controller_test.exs b/services/app/apps/codebattle/test/codebattle_web/controllers/user_controller_test.exs index 5d5902069..a059c5054 100644 --- a/services/app/apps/codebattle/test/codebattle_web/controllers/user_controller_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/controllers/user_controller_test.exs @@ -13,14 +13,10 @@ defmodule CodebattleWeb.UserControllerTest do end test "index", %{conn: conn} do - conn = - conn - |> get(Routes.user_path(conn, :index)) + conn = get(conn, Routes.user_path(conn, :index)) assert redirected_to(conn, 302) == - Routes.session_path(CodebattleWeb.Endpoint, :new, - next: Routes.user_path(conn, :index) - ) + Routes.session_path(CodebattleWeb.Endpoint, :new, next: Routes.user_path(conn, :index)) end test "new", %{conn: conn} do @@ -47,14 +43,10 @@ defmodule CodebattleWeb.UserControllerTest do test "show user: not signed in", %{conn: conn} do user = insert(:user) - conn = - conn - |> get(Routes.user_path(conn, :show, user.id)) + conn = get(conn, Routes.user_path(conn, :show, user.id)) assert redirected_to(conn, 302) == - Routes.session_path(CodebattleWeb.Endpoint, :new, - next: Routes.user_path(conn, :show, user.id) - ) + Routes.session_path(CodebattleWeb.Endpoint, :new, next: Routes.user_path(conn, :show, user.id)) end test "edit user", %{conn: conn} do diff --git a/services/app/apps/codebattle/test/codebattle_web/integration/game/give_up_test.exs b/services/app/apps/codebattle/test/codebattle_web/integration/game/give_up_test.exs index 97b54974a..93223fab6 100644 --- a/services/app/apps/codebattle/test/codebattle_web/integration/game/give_up_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/integration/game/give_up_test.exs @@ -37,7 +37,7 @@ defmodule CodebattleWeb.Integration.Game.GiveUpTest do # First player give_up Phoenix.ChannelTest.push(socket1, "give_up", %{}) :timer.sleep(70) - game = Game.Context.get_game!(game_id) |> Repo.preload(:playbook) + game = game_id |> Game.Context.get_game!() |> Repo.preload(:playbook) assert game.state == "game_over" assert Helpers.gave_up?(game, user1.id) == true diff --git a/services/app/apps/codebattle/test/codebattle_web/integration/game/recalculate_achivements_test.exs b/services/app/apps/codebattle/test/codebattle_web/integration/game/recalculate_achivements_test.exs index 4b0ea4dd0..7e01bc113 100644 --- a/services/app/apps/codebattle/test/codebattle_web/integration/game/recalculate_achivements_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/integration/game/recalculate_achivements_test.exs @@ -3,8 +3,8 @@ defmodule CodebattleWeb.Integration.Game.RecalculateAchivementsTest do import CodebattleWeb.Factory - alias CodebattleWeb.UserSocket alias Codebattle.User + alias CodebattleWeb.UserSocket setup %{conn: conn} do insert(:task) @@ -76,8 +76,7 @@ defmodule CodebattleWeb.Integration.Game.RecalculateAchivementsTest do user1: user1, user2: _user2 } do - ["js", "php", "ruby"] - |> Enum.each(fn x -> + Enum.each(["js", "php", "ruby"], fn x -> insert_list(3, :user_game, %{user: user1, lang: x, result: "won"}) end) diff --git a/services/app/apps/codebattle/test/codebattle_web/integration/game/rematch_test.exs b/services/app/apps/codebattle/test/codebattle_web/integration/game/rematch_test.exs index 63e339cd9..3fba3c462 100644 --- a/services/app/apps/codebattle/test/codebattle_web/integration/game/rematch_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/integration/game/rematch_test.exs @@ -16,8 +16,7 @@ defmodule CodebattleWeb.Integration.Game.RematchTest do socket1 = socket(UserSocket, "user_id", %{user_id: user1.id, current_user: user1}) socket2 = socket(UserSocket, "user_id", %{user_id: user2.id, current_user: user2}) - {:ok, - %{conn1: conn1, conn2: conn2, socket1: socket1, socket2: socket2, user1: user1, user2: user2}} + {:ok, %{conn1: conn1, conn2: conn2, socket1: socket1, socket2: socket2, user1: user1, user2: user2}} end test "first user gave up and send rematch offer, second user accept rematch", %{ @@ -42,7 +41,7 @@ defmodule CodebattleWeb.Integration.Game.RematchTest do {:ok, _response, socket2} = subscribe_and_join(socket2, GameChannel, game_topic) editor_text_init = - "const _ = require(\"lodash\");\nconst R = require(\"rambda\");\n\nconst solution = (a, b) => {\n return 0;\n};\n// use stdout to debug\n\nmodule.exports = solution;" + ~s|const _ = require("lodash");\nconst R = require("rambda");\n\nconst solution = (a, b) => {\n return 0;\n};\n// use stdout to debug\n\nmodule.exports = solution;| game = Game.Context.get_game!(game_id) assert game.state == "playing" diff --git a/services/app/apps/codebattle/test/codebattle_web/integration/game/standard_game_test.exs b/services/app/apps/codebattle/test/codebattle_web/integration/game/standard_game_test.exs index 33c5fbd4a..d9a00ec89 100644 --- a/services/app/apps/codebattle/test/codebattle_web/integration/game/standard_game_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/integration/game/standard_game_test.exs @@ -70,7 +70,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do assert Helpers.get_second_player(game).name == "second" assert Helpers.get_first_player(game).editor_text == - """ + String.trim(""" const _ = require("lodash"); const R = require("rambda"); @@ -80,11 +80,10 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do // use stdout to debug module.exports = solution; - """ - |> String.trim() + """) assert Helpers.get_second_player(game).editor_text == - """ + String.trim(""" const _ = require("lodash"); const R = require("rambda"); @@ -94,8 +93,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do // use stdout to debug module.exports = solution; - """ - |> String.trim() + """) # First player won editor_text1 = "Hello world1!" @@ -116,7 +114,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do assert Helpers.get_first_player(game).editor_text == "Hello world1!" assert Helpers.get_second_player(game).editor_text == - """ + String.trim(""" const _ = require("lodash"); const R = require("rambda"); @@ -126,8 +124,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do // use stdout to debug module.exports = solution; - """ - |> String.trim() + """) # Winner cannot check results again Phoenix.ChannelTest.push(socket1, "check_result", %{ @@ -145,7 +142,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do assert Helpers.get_first_player(game).editor_text == "Hello world2!" assert Helpers.get_second_player(game).editor_text == - """ + String.trim(""" const _ = require("lodash"); const R = require("rambda"); @@ -155,8 +152,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do // use stdout to debug module.exports = solution; - """ - |> String.trim() + """) # Second player complete game Phoenix.ChannelTest.push(socket2, "check_result", %{ @@ -223,7 +219,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do assert Helpers.get_second_player(game).name == "second" assert Helpers.get_first_player(game).editor_text == - """ + String.trim(""" const _ = require("lodash"); const R = require("rambda"); @@ -233,11 +229,10 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do // use stdout to debug module.exports = solution; - """ - |> String.trim() + """) assert Helpers.get_second_player(game).editor_text == - """ + String.trim(""" const _ = require("lodash"); const R = require("rambda"); @@ -247,8 +242,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do // use stdout to debug module.exports = solution; - """ - |> String.trim() + """) # First player won editor_text1 = "Hello world1!" @@ -269,7 +263,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do assert Helpers.get_first_player(game).editor_text == "Hello world1!" assert Helpers.get_second_player(game).editor_text == - """ + String.trim(""" const _ = require("lodash"); const R = require("rambda"); @@ -279,8 +273,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do // use stdout to debug module.exports = solution; - """ - |> String.trim() + """) # Winner cannot check results again Phoenix.ChannelTest.push(socket1, "check_result", %{ @@ -298,7 +291,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do assert Helpers.get_first_player(game).editor_text == "Hello world2!" assert Helpers.get_second_player(game).editor_text == - """ + String.trim(""" const _ = require("lodash"); const R = require("rambda"); @@ -308,8 +301,7 @@ defmodule CodebattleWeb.Integration.Game.StandardGameTest do // use stdout to debug module.exports = solution; - """ - |> String.trim() + """) # Second player complete game Phoenix.ChannelTest.push(socket2, "check_result", %{ diff --git a/services/app/apps/codebattle/test/codebattle_web/integration/game/timeout_test.exs b/services/app/apps/codebattle/test/codebattle_web/integration/game/timeout_test.exs index 84196c258..ff6173753 100644 --- a/services/app/apps/codebattle/test/codebattle_web/integration/game/timeout_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/integration/game/timeout_test.exs @@ -2,6 +2,7 @@ defmodule CodebattleWeb.Integration.Game.TimeoutTest do use Codebattle.IntegrationCase alias Codebattle.Game + alias Codebattle.Game.Context alias CodebattleWeb.UserSocket setup %{conn: conn} do @@ -56,9 +57,9 @@ defmodule CodebattleWeb.Integration.Game.TimeoutTest do |> get(game_path(conn2, :show, game_id)) |> follow_button("Join") - Codebattle.Game.Context.trigger_timeout(game_id) + Context.trigger_timeout(game_id) - assert %{state: "timeout"} = Codebattle.Game.Context.get_game!(game_id) + assert %{state: "timeout"} = Context.get_game!(game_id) {:ok, _response, socket1} = subscribe_and_join(socket1, LobbyChannel, "lobby") ref = Phoenix.ChannelTest.push(socket1, "game:create", %{level: "easy"}) diff --git a/services/app/apps/codebattle/test/codebattle_web/integration/tournament/arena_clan_95_percentile_test.exs b/services/app/apps/codebattle/test/codebattle_web/integration/tournament/arena_clan_95_percentile_test.exs index 06ac6b08b..5609f6fd2 100644 --- a/services/app/apps/codebattle/test/codebattle_web/integration/tournament/arena_clan_95_percentile_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/integration/tournament/arena_clan_95_percentile_test.exs @@ -2,6 +2,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do use Codebattle.IntegrationCase alias Codebattle.Tournament + alias Phoenix.Socket.Broadcast + alias Phoenix.Socket.Message test "Arena Clan 1 round sequential 95_percentile task_pack" do %{id: t1_id} = insert(:task, level: "easy") @@ -78,9 +80,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do Phoenix.ChannelTest.push(socket6, "tournament:join", %{}) # 7 users joined for 7 user sockets - 1..36 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..36, fn _i -> + assert_receive %Message{ event: "tournament:player:joined", payload: %{ player: %Tournament.Player{clan_id: _, id: _, name: _, state: "active"}, @@ -119,9 +120,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do Phoenix.ChannelTest.push(socket7, "tournament:join", %{}) - 1..7 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..7, fn _i -> + assert_receive %Message{ event: "tournament:player:joined", payload: %{ player: %Tournament.Player{clan_id: _, id: _, name: _, state: "active"}, @@ -129,7 +129,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do } } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:ranking_update", payload: %{ranking: %{}, clans: %{}} } @@ -179,9 +179,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do :timer.sleep(100) - 1..8 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..8, fn _i -> + assert_receive %Message{ event: "tournament:round_created", payload: %{ tournament: %{ @@ -195,7 +194,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do } end) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "waiting_room:player:match_created", payload: %{ current_player: %{id: ^u1_id, state: "active"}, @@ -204,9 +203,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do } } - 1..6 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..6, fn _i -> + assert_receive %Message{ event: "waiting_room:player:match_created", payload: %{ current_player: %{state: "active"}, @@ -216,7 +214,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do } end) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:update", payload: %{tournament: %{}}, topic: ^tournament_admin_topic @@ -229,9 +227,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do Phoenix.ChannelTest.push(socket8, "tournament:join", %{}) - 1..9 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..9, fn _i -> + assert_receive %Message{ event: "tournament:player:joined", payload: %{ player: %Tournament.Player{clan_id: _, id: _, name: _, state: "matchmaking_active"}, @@ -240,7 +237,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do } end) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:ranking_update", payload: %{ranking: %{}, clans: %{}} } @@ -255,25 +252,25 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do lang_slug: "js" }) - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ event: "user:start_check", payload: %{user_id: ^u1_id}, topic: ^game_topic } - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ event: "user:check_complete", payload: %{user_id: ^u1_id, solution_status: true}, topic: ^game_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "user:check_complete", payload: %{user_id: ^u1_id, solution_status: true}, topic: ^game_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "waiting_room:player:matchmaking_started", payload: %{ current_player: %{ @@ -293,7 +290,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do Phoenix.ChannelTest.assert_reply(ref_1, :ok) assert_receive {:socket_close, _, {:shutdown, :left}} - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "waiting_room:player:matchmaking_started", payload: %{ current_player: %{ @@ -308,7 +305,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do topic: ^tournament_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "waiting_room:player:matchmaking_started", payload: %{ current_player: %{ @@ -322,7 +319,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do topic: ^tournament_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:match:upserted", payload: %{ players: [%{state: "active"}, %{state: "active"}], @@ -331,7 +328,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClan95PercentileTest do topic: ^tournament_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:match:upserted", payload: %{ players: [%{state: "active"}, %{state: "active"}], diff --git a/services/app/apps/codebattle/test/codebattle_web/integration/tournament/arena_clan_test.exs b/services/app/apps/codebattle/test/codebattle_web/integration/tournament/arena_clan_test.exs index 0a52ba6de..0f0f948e8 100644 --- a/services/app/apps/codebattle/test/codebattle_web/integration/tournament/arena_clan_test.exs +++ b/services/app/apps/codebattle/test/codebattle_web/integration/tournament/arena_clan_test.exs @@ -2,6 +2,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do use Codebattle.IntegrationCase alias Codebattle.Tournament + alias Phoenix.Socket.Broadcast + alias Phoenix.Socket.Message test "Arena Clan 1 round sequential task_pack" do %{id: t1_id} = insert(:task, level: "easy") @@ -73,9 +75,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do Phoenix.ChannelTest.push(socket6, "tournament:join", %{}) # 7 users joined for 7 user sockets - 1..36 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..36, fn _i -> + assert_receive %Message{ event: "tournament:player:joined", payload: %{ player: %Tournament.Player{clan_id: _, id: _, name: _, state: "active"}, @@ -116,9 +117,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do Phoenix.ChannelTest.push(socket7, "tournament:join", %{}) - 1..7 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..7, fn _i -> + assert_receive %Message{ event: "tournament:player:joined", payload: %{ player: %Tournament.Player{clan_id: _, id: _, name: _, state: "active"}, @@ -126,7 +126,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do } } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:ranking_update", payload: %{ranking: %{}, clans: %{}} } @@ -173,9 +173,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do :timer.sleep(100) - 1..8 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..8, fn _i -> + assert_receive %Message{ event: "tournament:round_created", payload: %{ tournament: %{ @@ -189,7 +188,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do } end) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "waiting_room:player:match_created", payload: %{ current_player: %{id: ^u1_id, state: "active"}, @@ -198,9 +197,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do } } - 1..6 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..6, fn _i -> + assert_receive %Message{ event: "waiting_room:player:match_created", payload: %{ current_player: %{state: "active"}, @@ -210,7 +208,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do } end) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:update", payload: %{tournament: %{}}, topic: ^tournament_admin_topic @@ -223,9 +221,8 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do Phoenix.ChannelTest.push(socket8, "tournament:join", %{}) - 1..9 - |> Enum.each(fn _i -> - assert_receive %Phoenix.Socket.Message{ + Enum.each(1..9, fn _i -> + assert_receive %Message{ event: "tournament:player:joined", payload: %{ player: %Tournament.Player{clan_id: _, id: _, name: _, state: "matchmaking_active"}, @@ -234,7 +231,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do } end) - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:ranking_update", payload: %{ranking: %{}, clans: %{}} } @@ -249,25 +246,25 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do lang_slug: "js" }) - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ event: "user:start_check", payload: %{user_id: ^u1_id}, topic: ^game_topic } - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ event: "user:check_complete", payload: %{user_id: ^u1_id, solution_status: true}, topic: ^game_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "user:check_complete", payload: %{user_id: ^u1_id, solution_status: true}, topic: ^game_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "waiting_room:player:matchmaking_started", payload: %{ current_player: %{ @@ -287,7 +284,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do Phoenix.ChannelTest.assert_reply(ref_1, :ok) assert_receive {:socket_close, _, {:shutdown, :left}} - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "waiting_room:player:matchmaking_started", payload: %{ current_player: %{ @@ -302,7 +299,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do topic: ^tournament_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "waiting_room:player:matchmaking_started", payload: %{ current_player: %{ @@ -316,7 +313,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do topic: ^tournament_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:match:upserted", payload: %{ players: [%{state: "active"}, %{state: "active"}], @@ -325,7 +322,7 @@ defmodule CodebattleWeb.Integration.Tournament.ArenaClanTest do topic: ^tournament_topic } - assert_receive %Phoenix.Socket.Message{ + assert_receive %Message{ event: "tournament:match:upserted", payload: %{ players: [%{state: "active"}, %{state: "active"}], diff --git a/services/app/apps/codebattle/test/docker_execution/clojure_test.exs b/services/app/apps/codebattle/test/docker_execution/clojure_test.exs index a18e53d72..051898c96 100644 --- a/services/app/apps/codebattle/test/docker_execution/clojure_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/clojure_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.ClojureTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -38,11 +40,11 @@ defmodule Codebattle.DockerExecution.ClojureTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "failure", success_count: 0} = check_result + assert %Result{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -66,11 +68,11 @@ defmodule Codebattle.DockerExecution.ClojureTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "error", success_count: 0} = check_result + assert %Result{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -99,7 +101,7 @@ defmodule Codebattle.DockerExecution.ClojureTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/cpp_test.exs b/services/app/apps/codebattle/test/docker_execution/cpp_test.exs index 6075a9788..a873fcd88 100644 --- a/services/app/apps/codebattle/test/docker_execution/cpp_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/cpp_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.CppTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -33,11 +35,11 @@ defmodule Codebattle.DockerExecution.CppTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "error", success_count: 0} = check_result + assert %Result{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -63,11 +65,11 @@ defmodule Codebattle.DockerExecution.CppTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "failure", success_count: 0} = check_result + assert %Result{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -95,7 +97,7 @@ defmodule Codebattle.DockerExecution.CppTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } @@ -129,7 +131,7 @@ defmodule Codebattle.DockerExecution.CppTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/csharp_test.exs b/services/app/apps/codebattle/test/docker_execution/csharp_test.exs index b3248aa4d..c7770c12d 100644 --- a/services/app/apps/codebattle/test/docker_execution/csharp_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/csharp_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.CsharpTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -33,11 +35,11 @@ defmodule Codebattle.DockerExecution.CsharpTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "error", success_count: 0} = check_result + assert %Result{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -57,19 +59,18 @@ defmodule Codebattle.DockerExecution.CsharpTest do Mix.Shell.Process.flush() Phoenix.ChannelTest.push(socket1, "check_result", %{ - editor_text: - "using System; \n + editor_text: "using System; \n namespace app{ public class Solution { public int solution(int a, int b) { return a - b; } } }", lang_slug: "csharp" }) assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "failure", success_count: 0} = check_result + assert %Result{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -98,7 +99,7 @@ defmodule Codebattle.DockerExecution.CsharpTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/dart_test.exs b/services/app/apps/codebattle/test/docker_execution/dart_test.exs index 2152b3a2a..50d6a8ca1 100644 --- a/services/app/apps/codebattle/test/docker_execution/dart_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/dart_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.DartTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -33,11 +35,11 @@ defmodule Codebattle.DockerExecution.DartTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "error", success_count: 0} = check_result + assert %Result{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -63,11 +65,11 @@ defmodule Codebattle.DockerExecution.DartTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "failure", success_count: 0} = check_result + assert %Result{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -95,7 +97,7 @@ defmodule Codebattle.DockerExecution.DartTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } @@ -128,7 +130,7 @@ defmodule Codebattle.DockerExecution.DartTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/elixir_test.exs b/services/app/apps/codebattle/test/docker_execution/elixir_test.exs index 9c20675b3..9386c4461 100644 --- a/services/app/apps/codebattle/test/docker_execution/elixir_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/elixir_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.ElixirTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result.V2 alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -36,11 +38,11 @@ defmodule Codebattle.DockerExecution.ElixirTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result.V2{status: "failure", success_count: 0} = check_result + assert %V2{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -64,11 +66,11 @@ defmodule Codebattle.DockerExecution.ElixirTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result.V2{status: "error", success_count: 0} = check_result + assert %V2{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -97,7 +99,7 @@ defmodule Codebattle.DockerExecution.ElixirTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/golang_test.exs b/services/app/apps/codebattle/test/docker_execution/golang_test.exs index 10f87d2b4..200f926c9 100644 --- a/services/app/apps/codebattle/test/docker_execution/golang_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/golang_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.GolangTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -33,11 +35,11 @@ defmodule Codebattle.DockerExecution.GolangTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "error", success_count: 0} = check_result + assert %Result{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -63,11 +65,11 @@ defmodule Codebattle.DockerExecution.GolangTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "failure", success_count: 0} = check_result + assert %Result{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -95,7 +97,7 @@ defmodule Codebattle.DockerExecution.GolangTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/haskell_test.exs b/services/app/apps/codebattle/test/docker_execution/haskell_test.exs index 43e394fb5..6830fc177 100644 --- a/services/app/apps/codebattle/test/docker_execution/haskell_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/haskell_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.HaskellTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -30,18 +32,17 @@ defmodule Codebattle.DockerExecution.HaskellTest do Mix.Shell.Process.flush() Phoenix.ChannelTest.push(socket1, "check_result", %{ - editor_text: - "module Check.Solution where\n\nsolution :: Int -> Int -> Int\nsolution x y = x - y", + editor_text: "module Check.Solution where\n\nsolution :: Int -> Int -> Int\nsolution x y = x - y", lang_slug: "haskell" }) assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "failure", success_count: 0} = check_result + assert %Result{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -65,11 +66,11 @@ defmodule Codebattle.DockerExecution.HaskellTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "error", success_count: 0} = check_result + assert %Result{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -92,14 +93,13 @@ defmodule Codebattle.DockerExecution.HaskellTest do Phoenix.ChannelTest.push(socket1, "editor:data", %{editor_text: "test", lang_slug: "js"}) Phoenix.ChannelTest.push(socket1, "check_result", %{ - editor_text: - "module Check.Solution where\n\nsolution :: Int -> Int -> Int\nsolution x y = x + y", + editor_text: "module Check.Solution where\n\nsolution :: Int -> Int -> Int\nsolution x y = x + y", lang_slug: "haskell" }) assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/java_test.exs b/services/app/apps/codebattle/test/docker_execution/java_test.exs index 175346bb8..e98ba6219 100644 --- a/services/app/apps/codebattle/test/docker_execution/java_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/java_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.JavaTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -33,11 +35,11 @@ defmodule Codebattle.DockerExecution.JavaTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "error", success_count: 0} = check_result + assert %Result{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -57,19 +59,18 @@ defmodule Codebattle.DockerExecution.JavaTest do Mix.Shell.Process.flush() Phoenix.ChannelTest.push(socket1, "check_result", %{ - editor_text: - "package solution; \n + editor_text: "package solution; \n public class Solution { public Integer solution(Integer a, Integer b) { return a - b; } }", lang_slug: "java" }) assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "failure", success_count: 0} = check_result + assert %Result{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -98,7 +99,7 @@ defmodule Codebattle.DockerExecution.JavaTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } @@ -132,7 +133,7 @@ defmodule Codebattle.DockerExecution.JavaTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/js_test.exs b/services/app/apps/codebattle/test/docker_execution/js_test.exs index 7b540f9b1..239e6e8e1 100644 --- a/services/app/apps/codebattle/test/docker_execution/js_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/js_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.JSTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result.V2 alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -29,9 +31,9 @@ defmodule Codebattle.DockerExecution.JSTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{payload: %{check_result: check_result}} + assert_receive %Broadcast{payload: %{check_result: check_result}} - assert %Codebattle.CodeCheck.Result.V2{status: "error", success_count: 0} = check_result + assert %V2{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -57,11 +59,11 @@ defmodule Codebattle.DockerExecution.JSTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result.V2{status: "failure", success_count: 0} = check_result + assert %V2{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -89,7 +91,7 @@ defmodule Codebattle.DockerExecution.JSTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/kotlin_test.exs b/services/app/apps/codebattle/test/docker_execution/kotlin_test.exs index 47e2d80b4..ae5b5fa64 100644 --- a/services/app/apps/codebattle/test/docker_execution/kotlin_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/kotlin_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.KotlinTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -33,11 +35,11 @@ defmodule Codebattle.DockerExecution.KotlinTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "error", success_count: 0} = check_result + assert %Result{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -64,11 +66,11 @@ defmodule Codebattle.DockerExecution.KotlinTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "failure", success_count: 0} = check_result + assert %Result{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -96,7 +98,7 @@ defmodule Codebattle.DockerExecution.KotlinTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } @@ -130,7 +132,7 @@ defmodule Codebattle.DockerExecution.KotlinTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/php_test.exs b/services/app/apps/codebattle/test/docker_execution/php_test.exs index 153bafaa3..454554145 100644 --- a/services/app/apps/codebattle/test/docker_execution/php_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/php_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.PhpTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -33,11 +35,11 @@ defmodule Codebattle.DockerExecution.PhpTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "error", success_count: 0} = check_result + assert %Result{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -64,11 +66,11 @@ defmodule Codebattle.DockerExecution.PhpTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result{status: "failure", success_count: 0} = check_result + assert %Result{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) diff --git a/services/app/apps/codebattle/test/docker_execution/python_test.exs b/services/app/apps/codebattle/test/docker_execution/python_test.exs index 5214a73ab..06bc17f7b 100644 --- a/services/app/apps/codebattle/test/docker_execution/python_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/python_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.PythonTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result.V2 alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -36,11 +38,11 @@ defmodule Codebattle.DockerExecution.PythonTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result.V2{status: "failure", success_count: 0} = check_result + assert %V2{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -64,11 +66,11 @@ defmodule Codebattle.DockerExecution.PythonTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result.V2{status: "error", success_count: 0} = check_result + assert %V2{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -97,7 +99,7 @@ defmodule Codebattle.DockerExecution.PythonTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/ruby_test.exs b/services/app/apps/codebattle/test/docker_execution/ruby_test.exs index 3b136a605..29fec0664 100644 --- a/services/app/apps/codebattle/test/docker_execution/ruby_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/ruby_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.RubyTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result.V2 alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -36,11 +38,11 @@ defmodule Codebattle.DockerExecution.RubyTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result.V2{status: "failure", success_count: 0} = check_result + assert %V2{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -60,11 +62,11 @@ defmodule Codebattle.DockerExecution.RubyTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result.V2{status: "error", success_count: 0} = check_result + assert %V2{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) @@ -96,7 +98,7 @@ defmodule Codebattle.DockerExecution.RubyTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } @@ -127,7 +129,7 @@ defmodule Codebattle.DockerExecution.RubyTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/docker_execution/ts_test.exs b/services/app/apps/codebattle/test/docker_execution/ts_test.exs index aaaec74ba..8b5d38121 100644 --- a/services/app/apps/codebattle/test/docker_execution/ts_test.exs +++ b/services/app/apps/codebattle/test/docker_execution/ts_test.exs @@ -1,9 +1,11 @@ defmodule Codebattle.DockerExecution.TSTest do use Codebattle.IntegrationCase - alias CodebattleWeb.GameChannel + alias Codebattle.CodeCheck.Result.V2 alias Codebattle.Game + alias CodebattleWeb.GameChannel alias CodebattleWeb.UserSocket + alias Phoenix.Socket.Broadcast setup do user1 = insert(:user) @@ -33,11 +35,11 @@ defmodule Codebattle.DockerExecution.TSTest do assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result.V2{status: "error", success_count: 0} = check_result + assert %V2{status: "error", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" end @@ -56,18 +58,17 @@ defmodule Codebattle.DockerExecution.TSTest do Mix.Shell.Process.flush() Phoenix.ChannelTest.push(socket1, "check_result", %{ - editor_text: - "export default function solution(a: number, b: number) {\n\treturn a - b;\n};", + editor_text: "export default function solution(a: number, b: number) {\n\treturn a - b;\n};", lang_slug: "ts" }) assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{check_result: check_result} } - assert %Codebattle.CodeCheck.Result.V2{status: "failure", success_count: 0} = check_result + assert %V2{status: "failure", success_count: 0} = check_result game = Game.Context.get_game!(game.id) assert game.state == "playing" @@ -89,14 +90,13 @@ defmodule Codebattle.DockerExecution.TSTest do Phoenix.ChannelTest.push(socket1, "editor:data", %{editor_text: "test", lang_slug: "js"}) Phoenix.ChannelTest.push(socket1, "check_result", %{ - editor_text: - "export default function solution(a: number, b: number) {\n\treturn a + b;\n};", + editor_text: "export default function solution(a: number, b: number) {\n\treturn a + b;\n};", lang_slug: "ts" }) assert_code_check() - assert_receive %Phoenix.Socket.Broadcast{ + assert_receive %Broadcast{ payload: %{solution_status: true, state: "game_over"} } diff --git a/services/app/apps/codebattle/test/support/channel_case.ex b/services/app/apps/codebattle/test/support/channel_case.ex index d969476e2..f219fd67a 100644 --- a/services/app/apps/codebattle/test/support/channel_case.ex +++ b/services/app/apps/codebattle/test/support/channel_case.ex @@ -17,11 +17,15 @@ defmodule CodebattleWeb.ChannelCase do using do quote do + import CodebattleWeb.Factory # Import conveniences for testing with channels import Phoenix.ChannelTest - import CodebattleWeb.Factory + + alias Codebattle.Game + alias Codebattle.Repo + alias Codebattle.User + alias Codebattle.UserGame alias CodebattleWeb.Router.Helpers, as: Routes - alias Codebattle.{Repo, User, Game, UserGame} # The default endpoint for testing @endpoint CodebattleWeb.Endpoint diff --git a/services/app/apps/codebattle/test/support/conn_case.ex b/services/app/apps/codebattle/test/support/conn_case.ex index 459712b4c..e96c83945 100644 --- a/services/app/apps/codebattle/test/support/conn_case.ex +++ b/services/app/apps/codebattle/test/support/conn_case.ex @@ -24,15 +24,18 @@ defmodule CodebattleWeb.ConnCase do using do quote do - # Import conveniences for testing with connections - import Plug.Conn + import Codebattle.OauthTestHelpers + import CodebattleWeb.Factory import Phoenix.ConnTest import Phoenix.LiveViewTest - import CodebattleWeb.Factory - import Codebattle.OauthTestHelpers + # Import conveniences for testing with connections + import Plug.Conn - alias Codebattle.{Repo, User, Game, UserGame} - alias Codebattle.Game.{Player} + alias Codebattle.Game + alias Codebattle.Game.Player + alias Codebattle.Repo + alias Codebattle.User + alias Codebattle.UserGame alias CodebattleWeb.Router.Helpers, as: Routes # The default endpoint for testing diff --git a/services/app/apps/codebattle/test/support/data_case.ex b/services/app/apps/codebattle/test/support/data_case.ex index 7be3dd1ef..95ca2df9f 100644 --- a/services/app/apps/codebattle/test/support/data_case.ex +++ b/services/app/apps/codebattle/test/support/data_case.ex @@ -1,4 +1,5 @@ defmodule Codebattle.DataCase do + @moduledoc false use ExUnit.CaseTemplate alias Codebattle.Repo @@ -6,12 +7,11 @@ defmodule Codebattle.DataCase do using do quote do + import Codebattle.DataCase + import CodebattleWeb.Factory import Ecto import Ecto.Changeset import Ecto.Query - import Codebattle.DataCase - - import CodebattleWeb.Factory alias Codebattle.Game alias Codebattle.Repo diff --git a/services/app/apps/codebattle/test/support/factory.ex b/services/app/apps/codebattle/test/support/factory.ex index ff3aa5739..a8535adce 100644 --- a/services/app/apps/codebattle/test/support/factory.ex +++ b/services/app/apps/codebattle/test/support/factory.ex @@ -1,4 +1,5 @@ defmodule CodebattleWeb.Factory do + @moduledoc false use ExMachina.Ecto, repo: Codebattle.Repo alias Codebattle.Feedback diff --git a/services/app/apps/codebattle/test/support/integration_case.ex b/services/app/apps/codebattle/test/support/integration_case.ex index 846343724..086236d87 100644 --- a/services/app/apps/codebattle/test/support/integration_case.ex +++ b/services/app/apps/codebattle/test/support/integration_case.ex @@ -5,19 +5,23 @@ defmodule Codebattle.IntegrationCase do using do quote do - alias CodebattleWeb.Router.Helpers, as: Routes - import Phoenix.ChannelTest - import CodebattleWeb.Router.Helpers - import CodebattleWeb.Factory - import Plug.Conn - import Phoenix.ConnTest use CodebattleWeb.ConnCase use PhoenixIntegration - alias Codebattle.{Repo, User, Game, UserGame} + import CodebattleWeb.Factory + import CodebattleWeb.Router.Helpers + import Phoenix.ChannelTest + import Phoenix.ConnTest + import Plug.Conn + + alias Codebattle.Game alias Codebattle.Game.Helpers + alias Codebattle.Repo + alias Codebattle.User + alias Codebattle.UserGame alias CodebattleWeb.GameChannel alias CodebattleWeb.LobbyChannel + alias CodebattleWeb.Router.Helpers, as: Routes alias CodebattleWeb.TournamentAdminChannel alias CodebattleWeb.TournamentChannel alias CodebattleWeb.UserSocket diff --git a/services/app/apps/codebattle/test/support/oauth_helpers.ex b/services/app/apps/codebattle/test/support/oauth_helpers.ex index 62093c96e..0d325a087 100644 --- a/services/app/apps/codebattle/test/support/oauth_helpers.ex +++ b/services/app/apps/codebattle/test/support/oauth_helpers.ex @@ -1,4 +1,5 @@ defmodule Codebattle.OauthTestHelpers do + @moduledoc false @valid_github_body %{ "access_token" => "12345", "login" => "test_user", diff --git a/services/app/apps/codebattle/test/support/tournament_test_helpers.ex b/services/app/apps/codebattle/test/support/tournament_test_helpers.ex index e26e635c8..4f0b4f6bb 100644 --- a/services/app/apps/codebattle/test/support/tournament_test_helpers.ex +++ b/services/app/apps/codebattle/test/support/tournament_test_helpers.ex @@ -1,4 +1,5 @@ defmodule Codebattle.TournamentTestHelpers do + @moduledoc false import Codebattle.Tournament.Helpers def win_active_match(tournament, user, params \\ %{opponent_percent: 0}) do diff --git a/services/app/apps/runner/lib/runner/stale_containers_killer.ex b/services/app/apps/runner/lib/runner/stale_containers_killer.ex index 5230a12d8..ab4d5d03b 100644 --- a/services/app/apps/runner/lib/runner/stale_containers_killer.ex +++ b/services/app/apps/runner/lib/runner/stale_containers_killer.ex @@ -14,7 +14,7 @@ defmodule Runner.StaleContainersKiller do {:ok, state} end - def kill() do + def kill do send(self(), :check_game_containers) end @@ -45,7 +45,7 @@ defmodule Runner.StaleContainersKiller do head end - def list_containers() do + def list_containers do {containers, _} = System.cmd("docker", [ "ps", diff --git a/services/app/apps/runner/lib/runner/system_monitor_logger.ex b/services/app/apps/runner/lib/runner/system_monitor_logger.ex index 91e4649ab..0044012a7 100644 --- a/services/app/apps/runner/lib/runner/system_monitor_logger.ex +++ b/services/app/apps/runner/lib/runner/system_monitor_logger.ex @@ -18,7 +18,7 @@ defmodule Runner.SystemMonitorLogger do {:ok, state} end - def get_stats() do + def get_stats do send(self(), :get_stats) end diff --git a/services/app/apps/runner/test/runner/solution_generator_test.exs b/services/app/apps/runner/test/runner/solution_generator_test.exs index a226562c7..ee400012a 100644 --- a/services/app/apps/runner/test/runner/solution_generator_test.exs +++ b/services/app/apps/runner/test/runner/solution_generator_test.exs @@ -1,8 +1,8 @@ defmodule Runner.SolutionGeneratorTest do use ExUnit.Case, async: true - alias Runner.SolutionGenerator alias Runner.Languages + alias Runner.SolutionGenerator @clojure_expected """ (defn solution [a text b c nested_hash_of_string nested_array_of_string nested_array_of_array_of_strings] diff --git a/services/app/config/config.exs b/services/app/config/config.exs index e609623ee..498c72000 100644 --- a/services/app/config/config.exs +++ b/services/app/config/config.exs @@ -4,18 +4,8 @@ # This configuration file is loaded before any dependency and # is restricted to this project. import Config -# General application configuration -config :codebattle, ecto_repos: [Codebattle.Repo] -# Configures the endpoint -config :codebattle, CodebattleWeb.Endpoint, - http: [port: System.get_env("CODEBATTLE_PORT", "4000")], - adapter: Bandit.PhoenixAdapter, - url: [host: "localhost"], - secret_key_base: "zQ3/vT3oIVM94qXO7IgWeAqbLSAyGA9em6fdBw7OdbDnbeotEkWYANrjJWYNWpd/", - render_errors: [view: CodebattleWeb.ErrorView, accepts: ~w(html json), layout: false], - pubsub_server: CodebattleWeb.PubSub, - live_view: [signing_salt: "asdfasdf"] +config :codebattle, Codebattle.Bot, min_bot_step_timeout: 1_000 config :codebattle, CodebattleWeb.BotEndpoint, http: [ @@ -25,21 +15,80 @@ config :codebattle, CodebattleWeb.BotEndpoint, secret_key_base: "zQ3/vT3oIVM94qXO7IgWeAqbLSAyGA9em6fdBw7OdbDnbeotEkWYANrjJWYNWpd/", pubsub_server: CodebattleWeb.PubSub -# Configures the runner endpoint -config :runner, RunnerWeb.Endpoint, - url: [host: "localhost"], +# Configures the endpoint +config :codebattle, CodebattleWeb.Endpoint, + http: [port: System.get_env("CODEBATTLE_PORT", "4000")], adapter: Bandit.PhoenixAdapter, + url: [host: "localhost"], secret_key_base: "zQ3/vT3oIVM94qXO7IgWeAqbLSAyGA9em6fdBw7OdbDnbeotEkWYANrjJWYNWpd/", - render_errors: [view: RunnerWeb.ErrorView, accepts: ~w(json), layout: false], - pubsub_server: Runner.PubSub + render_errors: [view: CodebattleWeb.ErrorView, accepts: ~w(html json), layout: false], + pubsub_server: CodebattleWeb.PubSub, + live_view: [signing_salt: "asdfasdf"] + +config :codebattle, CodebattleWeb.Gettext, + priv: "priv/gettext", + default_locale: "en" + +config :codebattle, :api_key, "x-key" + +config :codebattle, :firebase, + sender_id: System.get_env("FIREBASE_SENDER_ID"), + api_key: System.get_env("FIREBASE_API_KEY"), + firebase_autn_url: "https://identitytoolkit.googleapis.com/v1/accounts" + +config :codebattle, :oauth, + github_client_id: System.get_env("GITHUB_CLIENT_ID", "ASFD"), + github_client_secret: System.get_env("GITHUB_CLIENT_SECRET", "ASFD"), + discord_client_id: System.get_env("DISCORD_CLIENT_ID", "ASFD"), + discord_client_secret: System.get_env("DISCORD_CLIENT_SECRET", "ASFD") + +config :codebattle, allow_guests: true +config :codebattle, app_version: System.get_env("APP_VERSION", "dev") +# config :codebattle, checker_executor: Codebattle.CodeCheck.Executor.RemoteRust +config :codebattle, asserts_executor: Codebattle.AssertsService.Executor.Remote +config :codebattle, chat_bot_token: System.get_env("CODEBATTLE_CHAT_BOT_TOKEN", "chat_bot") +config :codebattle, checker_executor: Codebattle.CodeCheck.Executor.RemoteDockerRun +config :codebattle, create_bot_games: true +config :codebattle, default_locale: System.get_env("CODEBATTLE_DEFAULT_LOCALE", "en") + +config :codebattle, + deployed_at: System.get_env("DEPLOYED_AT") || Calendar.strftime(DateTime.utc_now(), "%c") + +config :codebattle, dev_sign_in: true +# General application configuration +config :codebattle, ecto_repos: [Codebattle.Repo] +config :codebattle, fake_html_to_image: false +config :codebattle, force_redirect_url: "" +config :codebattle, freeze_time: false +config :codebattle, hide_footer: false +config :codebattle, hide_header: false +config :codebattle, html_debug_mode: true +config :codebattle, import_github_tasks: false + +config :codebattle, + jitsi_api_key: System.get_env("JITSI_API_KEY", "") + +config :codebattle, k8s_namespace: System.get_env("KUBERNETES_NAMESPACE", "default") +config :codebattle, load_dot_env_file: true +config :codebattle, max_alive_tournaments: 15 +config :codebattle, record_games: true +config :codebattle, restore_tournaments: false +config :codebattle, show_extension_popup: true +config :codebattle, tasks_provider: Codebattle.Game.TasksQueuesServer +config :codebattle, tournament_match_timeout: 3 * 60 +config :codebattle, tournament_rematch_timeout_ms: 2000 +config :codebattle, use_external_js: false +config :codebattle, use_only_token_auth: false +config :codebattle, use_presence: true +config :codebattle, user_rank_server: true + +config :fun_with_flags, :cache_bust_notifications, enabled: false config :fun_with_flags, :persistence, adapter: FunWithFlags.Store.Persistent.Ecto, repo: Codebattle.Repo, ecto_table_name: "feature_flags" -config :fun_with_flags, :cache_bust_notifications, enabled: false - # Configures Elixir's Logger config :logger, :console, format: "$time $metadata[$level] $message\n", @@ -47,16 +96,6 @@ config :logger, :console, config :phoenix, :json_library, Jason -config :codebattle, :oauth, - github_client_id: System.get_env("GITHUB_CLIENT_ID", "ASFD"), - github_client_secret: System.get_env("GITHUB_CLIENT_SECRET", "ASFD"), - discord_client_id: System.get_env("DISCORD_CLIENT_ID", "ASFD"), - discord_client_secret: System.get_env("DISCORD_CLIENT_SECRET", "ASFD") - -config :codebattle, CodebattleWeb.Gettext, - priv: "priv/gettext", - default_locale: "en" - config :phoenix_meta_tags, title: "Hexlet Codebattle • Game for programmers", description: @@ -78,61 +117,23 @@ config :phoenix_meta_tags, card: "summary_large_image" } -config :codebattle, Codebattle.Bot, min_bot_step_timeout: 1_000 - -config :codebattle, checker_executor: Codebattle.CodeCheck.Executor.RemoteDockerRun -# config :codebattle, checker_executor: Codebattle.CodeCheck.Executor.RemoteRust -config :codebattle, asserts_executor: Codebattle.AssertsService.Executor.Remote - -config :codebattle, tournament_match_timeout: 3 * 60 -config :codebattle, max_alive_tournaments: 15 -config :codebattle, tasks_provider: Codebattle.Game.TasksQueuesServer - -config :codebattle, :firebase, - sender_id: System.get_env("FIREBASE_SENDER_ID"), - api_key: System.get_env("FIREBASE_API_KEY"), - firebase_autn_url: "https://identitytoolkit.googleapis.com/v1/accounts" - -config :codebattle, :api_key, "x-key" -config :codebattle, restore_tournaments: false -config :codebattle, freeze_time: false -config :codebattle, load_dot_env_file: true -config :codebattle, import_github_tasks: false -config :codebattle, user_rank_server: true -config :codebattle, create_bot_games: true -config :codebattle, use_external_js: false -config :codebattle, hide_header: false -config :codebattle, hide_footer: false -config :codebattle, html_debug_mode: true -config :codebattle, dev_sign_in: true -config :codebattle, fake_html_to_image: false -config :codebattle, use_only_token_auth: false -config :codebattle, show_extension_popup: true -config :codebattle, app_version: System.get_env("APP_VERSION", "dev") -config :codebattle, tournament_rematch_timeout_ms: 2000 -config :codebattle, force_redirect_url: "" -config :codebattle, allow_guests: true -config :codebattle, record_games: true -config :codebattle, use_presence: true -config :codebattle, chat_bot_token: System.get_env("CODEBATTLE_CHAT_BOT_TOKEN", "chat_bot") -config :codebattle, default_locale: System.get_env("CODEBATTLE_DEFAULT_LOCALE", "en") - -config :codebattle, - deployed_at: System.get_env("DEPLOYED_AT") || Calendar.strftime(DateTime.utc_now(), "%c") - -config :codebattle, - jitsi_api_key: System.get_env("JITSI_API_KEY", "") +config :runner, Runner.DockerImagesPuller, timeout: to_timeout(hour: 7) -config :codebattle, k8s_namespace: System.get_env("KUBERNETES_NAMESPACE", "default") +# Configures the runner endpoint +config :runner, RunnerWeb.Endpoint, + url: [host: "localhost"], + adapter: Bandit.PhoenixAdapter, + secret_key_base: "zQ3/vT3oIVM94qXO7IgWeAqbLSAyGA9em6fdBw7OdbDnbeotEkWYANrjJWYNWpd/", + render_errors: [view: RunnerWeb.ErrorView, accepts: ~w(json), layout: false], + pubsub_server: Runner.PubSub config :runner, :runner_url, "http://localhost:4001" +config :runner, fake_docker_run: false config :runner, load_dot_env_file: true +config :runner, max_parallel_containers_run: 16 config :runner, pull_docker_images: false -config :runner, runner_cpu_logger: false config :runner, runner_container_killer: false -config :runner, max_parallel_containers_run: 16 -config :runner, Runner.DockerImagesPuller, timeout: :timer.hours(7) -config :runner, fake_docker_run: false +config :runner, runner_cpu_logger: false # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. diff --git a/services/app/config/dev.exs b/services/app/config/dev.exs index 7cd236a0c..520d38a24 100644 --- a/services/app/config/dev.exs +++ b/services/app/config/dev.exs @@ -1,5 +1,7 @@ import Config +alias Codebattle.CodeCheck.Executor.Local + root_dir = File.cwd!() # For development, we disable any cache and enable @@ -9,13 +11,19 @@ root_dir = File.cwd!() # watchers to your application. For example, we use it # with brunch.io to recompile .js and .css sources. -config :codebattle, CodebattleWeb.Endpoint, - http: [port: System.get_env("CODEBATTLE_PORT", "4000")], - debug_errors: true, - code_reloader: true, - check_origin: false, - cache_static_lookup: false, - watchers: [yarn: ["watch", cd: ".." |> Path.expand(__DIR__) |> Path.join("apps/codebattle")]] +config :codebattle, Codebattle.Invite, + timeout: to_timeout(minute: 15), + lifetime: to_timeout(minute: 15) + +config :codebattle, Codebattle.Plugs, rollbar_api_key: System.get_env("ROLLBAR_API_KEY") + +# Configure your database +config :codebattle, Codebattle.Repo, + username: System.get_env("CODEBATTLE_DB_USERNAME", "postgres"), + password: System.get_env("CODEBATTLE_DB_PASSWORD", "postgres"), + hostname: System.get_env("CODEBATTLE_DB_HOSTNAME", "localhost"), + database: System.get_env("CODEBATTLE_DB_NAME", "codebattle_dev"), + pool_size: 7 config :codebattle, CodebattleWeb.BotEndpoint, http: [port: "4002"], @@ -24,11 +32,13 @@ config :codebattle, CodebattleWeb.BotEndpoint, check_origin: false, cache_static_lookup: false -config :runner, RunnerWeb.Endpoint, - http: [port: System.get_env("CODEBATTLE_RUNNER_PORT", "4001")], +config :codebattle, CodebattleWeb.Endpoint, + http: [port: System.get_env("CODEBATTLE_PORT", "4000")], debug_errors: true, code_reloader: true, - check_origin: false + check_origin: false, + cache_static_lookup: false, + watchers: [yarn: ["watch", cd: ".." |> Path.expand(__DIR__) |> Path.join("apps/codebattle")]] # Watch static and templates for browser reloading. config :codebattle, CodebattleWeb.Endpoint, @@ -42,6 +52,9 @@ config :codebattle, CodebattleWeb.Endpoint, ] ] +config :codebattle, asserts_executor: Local +config :codebattle, checker_executor: Local + # Do not include metadata nor timestamps in development logs config :logger, :console, format: "[$level] $message\n", level: :debug @@ -49,19 +62,8 @@ config :logger, :console, format: "[$level] $message\n", level: :debug # in production as building large stacktraces may be expensive. config :phoenix, :stacktrace_depth, 20 -# Configure your database -config :codebattle, Codebattle.Repo, - username: System.get_env("CODEBATTLE_DB_USERNAME", "postgres"), - password: System.get_env("CODEBATTLE_DB_PASSWORD", "postgres"), - hostname: System.get_env("CODEBATTLE_DB_HOSTNAME", "localhost"), - database: System.get_env("CODEBATTLE_DB_NAME", "codebattle_dev"), - pool_size: 7 - -config :codebattle, Codebattle.Plugs, rollbar_api_key: System.get_env("ROLLBAR_API_KEY") - -config :codebattle, Codebattle.Invite, - timeout: :timer.minutes(15), - lifetime: :timer.minutes(15) - -config :codebattle, checker_executor: Codebattle.CodeCheck.Executor.Local -config :codebattle, asserts_executor: Codebattle.CodeCheck.Executor.Local +config :runner, RunnerWeb.Endpoint, + http: [port: System.get_env("CODEBATTLE_RUNNER_PORT", "4001")], + debug_errors: true, + code_reloader: true, + check_origin: false diff --git a/services/app/config/prod.exs b/services/app/config/prod.exs index 8bdfafcd6..b78b37410 100644 --- a/services/app/config/prod.exs +++ b/services/app/config/prod.exs @@ -1,5 +1,8 @@ import Config +config :codebattle, Codebattle.Invite, lifetime: to_timeout(minute: 15) +config :codebattle, Codebattle.Invite, timeout: to_timeout(minute: 15) + config :codebattle, CodebattleWeb.Endpoint, http: [ port: System.get_env("CODEBATTLE_PORT", "4000") @@ -15,22 +18,17 @@ config :codebattle, CodebattleWeb.Endpoint, version: Mix.Project.config()[:version], check_origin: false -config :logger, level: :error - -config :codebattle, Codebattle.Invite, timeout: :timer.minutes(15) -config :codebattle, Codebattle.Invite, lifetime: :timer.minutes(15) -config :codebattle, ws_port: 4000 - -config :codebattle, restore_tournaments: true -config :codebattle, load_dot_env_file: false -config :codebattle, import_github_tasks: true +config :codebattle, app_version: System.get_env("APP_VERSION", "") +config :codebattle, dev_sign_in: false +config :codebattle, html_debug_mode: false config :codebattle, html_env: :prod +config :codebattle, import_github_tasks: true +config :codebattle, load_dot_env_file: false +config :codebattle, restore_tournaments: true config :codebattle, use_external_js: true -config :codebattle, html_debug_mode: false -config :codebattle, dev_sign_in: false -config :codebattle, app_version: System.get_env("APP_VERSION", "") +config :codebattle, ws_port: 4000 -config :runner, load_dot_env_file: false +config :logger, level: :error config :runner, RunnerWeb.Endpoint, http: [port: System.get_env("4001")], @@ -39,3 +37,5 @@ config :runner, RunnerWeb.Endpoint, root: ".", version: Mix.Project.config()[:version], check_origin: false + +config :runner, load_dot_env_file: false diff --git a/services/app/config/releases.exs b/services/app/config/releases.exs index 72565cd94..d370d9f11 100644 --- a/services/app/config/releases.exs +++ b/services/app/config/releases.exs @@ -5,24 +5,35 @@ host = System.get_env("CODEBATTLE_HOSTNAME", "codebattle.hexlet.io") secret_key_base = System.get_env("CODEBATTLE_SECRET_KEY_BASE") live_view_salt = System.get_env("CODEBATTLE_LIVE_VIEW_SALT") -config :codebattle, CodebattleWeb.Endpoint, - http: [port: port], - url: [host: host, scheme: "https", port: 443], - cache_static_manifest: "priv/static/cache_manifest.json", - secret_key_base: secret_key_base, - live_view: [signing_salt: live_view_salt], - server: true +import_github_tasks = System.get_env("CODEBATTLE_IMPORT_GITHUB_TASKS") == "true" +create_bot_games = System.get_env("CODEBATTLE_CREATE_BOT_GAMES") == "true" +use_external_js = System.get_env("CODEBATTLE_USE_EXTERNAL_JS") == "true" +hide_header = System.get_env("CODEBATTLE_HIDE_HEADER") == "true" +hide_footer = System.get_env("CODEBATTLE_HIDE_FOOTER") == "true" +hide_user_dropdown = System.get_env("CODEBATTLE_HIDE_USER_DROPDOWN") == "true" +hide_invites = System.get_env("CODEBATTLE_HIDE_INVITES") == "true" +use_only_token_auth = System.get_env("CODEBATTLE_USE_ONLY_TOKEN_AUTH") == "true" +show_extension_popup = System.get_env("CODEBATTLE_SHOW_EXTENSION_POPUP") == "true" +allow_guests = System.get_env("CODEBATTLE_ALLOW_GUESTS") == "true" +use_presence = System.get_env("CODEBATTLE_USE_PRESENCE") == "true" +record_games = System.get_env("CODEBATTLE_RECORD_GAMES") == "true" +use_event_rating = System.get_env("CODEBATTLE_USE_EVENT_RATING") == "true" +use_event_rank = System.get_env("CODEBATTLE_USE_EVENT_RANK") == "true" -config :codebattle, CodebattleWeb.BotEndpoint, - http: [:inet6, port: "4002"], - url: [host: host, scheme: "https", port: 443], - secret_key_base: secret_key_base, - server: true +tournament_rematch_timeout_ms = + "CODEBATTLE_TOURNAMENT_REMATCH_TIMEOUT_MS" |> System.get_env("5000") |> String.to_integer() -config :codebattle, host: host +checker_executor = + case System.get_env("CODEBATTLE_EXECUTOR") do + "rust" -> Codebattle.CodeCheck.Executor.RemoteRust + _ -> Codebattle.CodeCheck.Executor.RemoteDockerRun + end -config :codebattle, - jitsi_api_key: System.get_env("JITSI_API_KEY", "") +port = System.get_env("CODEBATTLE_RUNNER_PORT", "4001") +host = System.get_env("CODEBATTLE_RUNNER_HOSTNAME", "codebattle.hexlet.io") +secret_key_base = System.get_env("CODEBATTLE_SECRET_KEY_BASE") + +config :codebattle, Codebattle.Plugs, rollbar_api_key: System.get_env("ROLLBAR_API_KEY") config :codebattle, Codebattle.Repo, adapter: Ecto.Adapters.Postgres, @@ -38,12 +49,71 @@ config :codebattle, Codebattle.Repo, pool_size: "CODEBATTLE_POOL_SIZE" |> System.get_env("10") |> String.to_integer(), log_level: :error +config :codebattle, CodebattleWeb.BotEndpoint, + http: [:inet6, port: "4002"], + url: [host: host, scheme: "https", port: 443], + secret_key_base: secret_key_base, + server: true + +config :codebattle, CodebattleWeb.Endpoint, + http: [port: port], + url: [host: host, scheme: "https", port: 443], + cache_static_manifest: "priv/static/cache_manifest.json", + secret_key_base: secret_key_base, + live_view: [signing_salt: live_view_salt], + server: true + +config :codebattle, :api_key, System.get_env("CODEBATTLE_API_AUTH_KEY") + +config :codebattle, :firebase, + sender_id: System.get_env("FIREBASE_SENDER_ID"), + api_key: System.get_env("FIREBASE_API_KEY"), + firebase_autn_url: "https://identitytoolkit.googleapis.com/v1/accounts" + +config :codebattle, :lobby_event_slug, System.get_env("CODEBATTLE_LOBBY_EVENT_SLUG") + config :codebattle, :oauth, github_client_id: System.get_env("GITHUB_CLIENT_ID", "ASFD"), github_client_secret: System.get_env("GITHUB_CLIENT_SECRET", "ASFD"), discord_client_id: System.get_env("DISCORD_CLIENT_ID", "ASFD"), discord_client_secret: System.get_env("DISCORD_CLIENT_SECRET", "ASFD") +config :codebattle, allow_guests: allow_guests +config :codebattle, asserts_executor: Codebattle.AssertsService.Executor.Remote +config :codebattle, checker_executor: checker_executor +config :codebattle, collab_logo: System.get_env("CODEBATTLE_COLLAB_LOGO") +config :codebattle, collab_logo_minor: System.get_env("CODEBATTLE_COLLAB_LOGO_MINOR") +config :codebattle, create_bot_games: create_bot_games +config :codebattle, default_locale: System.get_env("CODEBATTLE_DEFAULT_LOCALE", "en") + +config :codebattle, + deployed_at: System.get_env("DEPLOYED_AT") || Calendar.strftime(DateTime.utc_now(), "%c") + +config :codebattle, force_locale: System.get_env("CODEBATTLE_FORCE_LOCALE", "false") == "true" +config :codebattle, force_redirect_url: System.get_env("CODEBATTLE_FORCE_REDIRECT_URL") + +config :codebattle, + guest_user_force_redirect_url: System.get_env("CODEBATTLE_GUEST_USER_FORCE_REDIRECT_URL") + +config :codebattle, hide_footer: hide_footer +config :codebattle, hide_header: hide_header +config :codebattle, hide_invites: hide_invites +config :codebattle, hide_user_dropdown: hide_user_dropdown +config :codebattle, host: host +config :codebattle, import_github_tasks: import_github_tasks + +config :codebattle, + jitsi_api_key: System.get_env("JITSI_API_KEY", "") + +config :codebattle, record_games: record_games +config :codebattle, show_extension_popup: show_extension_popup +config :codebattle, tournament_rematch_timeout_ms: tournament_rematch_timeout_ms +config :codebattle, use_event_rank: use_event_rank +config :codebattle, use_event_rating: use_event_rating +config :codebattle, use_external_js: use_external_js +config :codebattle, use_only_token_auth: use_only_token_auth +config :codebattle, use_presence: use_presence + config :phoenix_meta_tags, title: System.get_env("CODEBATTLE_META_TITLE", "Hexlet Codebattle • Game for programmers"), description: @@ -76,67 +146,20 @@ config :phoenix_meta_tags, card: "summary_large_image" } -import_github_tasks = System.get_env("CODEBATTLE_IMPORT_GITHUB_TASKS") == "true" -create_bot_games = System.get_env("CODEBATTLE_CREATE_BOT_GAMES") == "true" -use_external_js = System.get_env("CODEBATTLE_USE_EXTERNAL_JS") == "true" -hide_header = System.get_env("CODEBATTLE_HIDE_HEADER") == "true" -hide_footer = System.get_env("CODEBATTLE_HIDE_FOOTER") == "true" -hide_user_dropdown = System.get_env("CODEBATTLE_HIDE_USER_DROPDOWN") == "true" -hide_invites = System.get_env("CODEBATTLE_HIDE_INVITES") == "true" -use_only_token_auth = System.get_env("CODEBATTLE_USE_ONLY_TOKEN_AUTH") == "true" -show_extension_popup = System.get_env("CODEBATTLE_SHOW_EXTENSION_POPUP") == "true" -allow_guests = System.get_env("CODEBATTLE_ALLOW_GUESTS") == "true" -use_presence = System.get_env("CODEBATTLE_USE_PRESENCE") == "true" -record_games = System.get_env("CODEBATTLE_RECORD_GAMES") == "true" -use_event_rating = System.get_env("CODEBATTLE_USE_EVENT_RATING") == "true" -use_event_rank = System.get_env("CODEBATTLE_USE_EVENT_RANK") == "true" - -tournament_rematch_timeout_ms = - "CODEBATTLE_TOURNAMENT_REMATCH_TIMEOUT_MS" |> System.get_env("5000") |> String.to_integer() - -config :codebattle, import_github_tasks: import_github_tasks -config :codebattle, create_bot_games: create_bot_games -config :codebattle, use_external_js: use_external_js -config :codebattle, hide_header: hide_header -config :codebattle, hide_footer: hide_footer -config :codebattle, hide_user_dropdown: hide_user_dropdown -config :codebattle, hide_invites: hide_invites -config :codebattle, use_only_token_auth: use_only_token_auth -config :codebattle, show_extension_popup: show_extension_popup -config :codebattle, tournament_rematch_timeout_ms: tournament_rematch_timeout_ms -config :codebattle, allow_guests: allow_guests -config :codebattle, use_presence: use_presence -config :codebattle, record_games: record_games -config :codebattle, collab_logo: System.get_env("CODEBATTLE_COLLAB_LOGO") -config :codebattle, collab_logo_minor: System.get_env("CODEBATTLE_COLLAB_LOGO_MINOR") -config :codebattle, force_redirect_url: System.get_env("CODEBATTLE_FORCE_REDIRECT_URL") -config :codebattle, use_event_rating: use_event_rating -config :codebattle, use_event_rank: use_event_rank - -config :codebattle, - guest_user_force_redirect_url: System.get_env("CODEBATTLE_GUEST_USER_FORCE_REDIRECT_URL") - -config :codebattle, Codebattle.Plugs, rollbar_api_key: System.get_env("ROLLBAR_API_KEY") - -config :codebattle, :firebase, - sender_id: System.get_env("FIREBASE_SENDER_ID"), - api_key: System.get_env("FIREBASE_API_KEY"), - firebase_autn_url: "https://identitytoolkit.googleapis.com/v1/accounts" +config :runner, RunnerWeb.Endpoint, + http: [:inet6, port: port], + url: [host: host, port: 81], + secret_key_base: secret_key_base, + server: true -checker_executor = - case System.get_env("CODEBATTLE_EXECUTOR") do - "rust" -> Codebattle.CodeCheck.Executor.RemoteRust - _ -> Codebattle.CodeCheck.Executor.RemoteDockerRun - end +config :runner, :runner_url, "http://runner.default.svc" +config :runner, container_killer: System.get_env("RUNNER_CONTAINER_KILLER", "") == "true" +config :runner, cpu_logger: System.get_env("RUNNER_CPU_LOGGER", "") == "true" -config :codebattle, checker_executor: checker_executor -config :codebattle, asserts_executor: Codebattle.AssertsService.Executor.Remote -config :codebattle, :api_key, System.get_env("CODEBATTLE_API_AUTH_KEY") -config :codebattle, :lobby_event_slug, System.get_env("CODEBATTLE_LOBBY_EVENT_SLUG") -config :codebattle, default_locale: System.get_env("CODEBATTLE_DEFAULT_LOCALE", "en") -config :codebattle, force_locale: System.get_env("CODEBATTLE_FORCE_LOCALE", "false") == "true" +config :runner, + max_parallel_containers_run: "CODEBATTLE_MAX_PARALLEL_CONTAINERS_RUN" |> System.get_env("16") |> String.to_integer() -config :sentry_fe, dsn: System.get_env("SENTRY_FE_DNS_URL") || System.get_env("SENTRY_DNS_URL") +config :runner, pull_docker_images: System.get_env("RUNNER_PULL_DOCKER_IMAGES", "") == "true" config :sentry, dsn: System.get_env("SENTRY_DNS_URL"), @@ -144,24 +167,4 @@ config :sentry, enable_source_code_context: true, root_source_code_paths: [File.cwd!()] -port = System.get_env("CODEBATTLE_RUNNER_PORT", "4001") -host = System.get_env("CODEBATTLE_RUNNER_HOSTNAME", "codebattle.hexlet.io") -secret_key_base = System.get_env("CODEBATTLE_SECRET_KEY_BASE") - -config :codebattle, - deployed_at: System.get_env("DEPLOYED_AT") || Calendar.strftime(DateTime.utc_now(), "%c") - -config :runner, RunnerWeb.Endpoint, - http: [:inet6, port: port], - url: [host: host, port: 81], - secret_key_base: secret_key_base, - server: true - -config :runner, - max_parallel_containers_run: - System.get_env("CODEBATTLE_MAX_PARALLEL_CONTAINERS_RUN", "16") |> String.to_integer() - -config :runner, :runner_url, "http://runner.default.svc" -config :runner, pull_docker_images: System.get_env("RUNNER_PULL_DOCKER_IMAGES", "") == "true" -config :runner, cpu_logger: System.get_env("RUNNER_CPU_LOGGER", "") == "true" -config :runner, container_killer: System.get_env("RUNNER_CONTAINER_KILLER", "") == "true" +config :sentry_fe, dsn: System.get_env("SENTRY_FE_DNS_URL") || System.get_env("SENTRY_DNS_URL") diff --git a/services/app/config/test.exs b/services/app/config/test.exs index 0b8b39284..d9d48a16a 100644 --- a/services/app/config/test.exs +++ b/services/app/config/test.exs @@ -1,39 +1,5 @@ import Config -# We don't run a server during test. If one is required, -# you can enable the server option below. -config :codebattle, CodebattleWeb.Endpoint, - http: [port: 4001], - server: true - -config :codebattle, CodebattleWeb.BotEndpoint, - http: [port: 4002], - server: true - -config :phoenix_integration, endpoint: CodebattleWeb.Endpoint - -# Print only warnings and errors during test -# if is_nil(System.get_env("DEBUG")) do -# config :logger, level: :critical -# else -config :logger, :console, level: :error -# end - -# Configure your database -config :codebattle, Codebattle.Repo, - username: System.get_env("CODEBATTLE_DB_USERNAME", "postgres"), - password: System.get_env("CODEBATTLE_DB_PASSWORD", "postgres"), - database: "codebattle_test", - hostname: System.get_env("CODEBATTLE_DB_HOSTNAME", "localhost"), - pool: Ecto.Adapters.SQL.Sandbox, - log: false, - pool_size: 50, - ownership_timeout: 99_999_999 - -config :codebattle, Codebattle.Bot, - timeout: 60_000, - min_bot_step_timeout: 0 - checker_executor = case System.get_env("CODEBATTLE_EXECUTOR") do "local" -> Codebattle.CodeCheck.Executor.Local @@ -49,42 +15,73 @@ asserts_executor = _ -> Codebattle.AssertsService.Executor.Fake end -config :codebattle, checker_executor: checker_executor -config :codebattle, asserts_executor: asserts_executor -config :codebattle, code_check_timeout: 35_000 -config :codebattle, tournament_match_timeout: 1 -config :codebattle, max_alive_tournaments: 700 +config :codebattle, Codebattle.Bot, + timeout: 60_000, + min_bot_step_timeout: 0 -config :codebattle, - auth_req_options: [ - plug: {Req.Test, Codebattle.Auth} - ] +# end +config :codebattle, Codebattle.Invite, + timeout: to_timeout(second: 1000), + # Configure your database + lifetime: to_timeout(second: 0) -config :codebattle, :oauth, - github_client_id: "GITHUB_CLIENT_ID", - github_client_secret: "GITHUB_CLIENT_SECRET", - discord_client_id: "DISCORD_CLIENT_ID", - discord_client_secret: "DISCORD_CLIENT_SECRET" +config :codebattle, Codebattle.Repo, + username: System.get_env("CODEBATTLE_DB_USERNAME", "postgres"), + password: System.get_env("CODEBATTLE_DB_PASSWORD", "postgres"), + database: "codebattle_test", + hostname: System.get_env("CODEBATTLE_DB_HOSTNAME", "localhost"), + pool: Ecto.Adapters.SQL.Sandbox, + log: false, + pool_size: 50, + ownership_timeout: 99_999_999 -config :codebattle, Codebattle.Invite, - timeout: :timer.seconds(1000), - lifetime: :timer.seconds(0) +config :codebattle, CodebattleWeb.BotEndpoint, + http: [port: 4002], + # We don't run a server during test. If one is required, + # you can enable the server option below. + server: true -config :codebattle, tasks_provider: Codebattle.Game.FakeTasksQueuesServer +config :codebattle, CodebattleWeb.Endpoint, + http: [port: 4001], + server: true config :codebattle, :firebase, sender_id: "ASDF", api_key: "ASDF", firebase_autn_url: "http://localhost:4000" -config :codebattle, ws_port: 4001 +config :codebattle, :oauth, + github_client_id: "GITHUB_CLIENT_ID", + github_client_secret: "GITHUB_CLIENT_SECRET", + discord_client_id: "DISCORD_CLIENT_ID", + discord_client_secret: "DISCORD_CLIENT_SECRET" -config :codebattle, freeze_time: true -config :codebattle, tournament_rematch_timeout_ms: 1 +config :codebattle, app_version: "fc426ea537962d8e5af5e31e515f7000deeedc68" +config :codebattle, asserts_executor: asserts_executor -config :codebattle, user_rank_server: false +config :codebattle, + auth_req_options: [ + plug: {Req.Test, Codebattle.Auth} + ] + +config :codebattle, checker_executor: checker_executor +config :codebattle, code_check_timeout: 35_000 config :codebattle, create_bot_games: false config :codebattle, fake_html_to_image: true -config :codebattle, app_version: "fc426ea537962d8e5af5e31e515f7000deeedc68" +config :codebattle, freeze_time: true +config :codebattle, max_alive_tournaments: 700 +config :codebattle, tasks_provider: Codebattle.Game.FakeTasksQueuesServer +config :codebattle, tournament_match_timeout: 1 +config :codebattle, tournament_rematch_timeout_ms: 1 +# Print only warnings and errors during test +# if is_nil(System.get_env("DEBUG")) do +# config :logger, level: :critical +# else +config :codebattle, user_rank_server: false +config :codebattle, ws_port: 4001 + +config :logger, :console, level: :error + +config :phoenix_integration, endpoint: CodebattleWeb.Endpoint config :runner, fake_docker_run: true diff --git a/services/app/mix.lock b/services/app/mix.lock index 4911e7ae3..8cf8984ae 100644 --- a/services/app/mix.lock +++ b/services/app/mix.lock @@ -75,6 +75,7 @@ "sentry": {:hex, :sentry, "10.8.1", "aa45309785e1521416225adb16e0b4d8b957578804527f3c7babb6fefbc5e456", [:mix], [{:hackney, "~> 1.8", [hex: :hackney, repo: "hexpm", optional: true]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_options, "~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:nimble_ownership, "~> 0.3.0 or ~> 1.0", [hex: :nimble_ownership, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.6", [hex: :phoenix, repo: "hexpm", optional: true]}, {:phoenix_live_view, "~> 0.20 or ~> 1.0", [hex: :phoenix_live_view, repo: "hexpm", optional: true]}, {:plug, "~> 1.6", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "495b3cdadad90ba72eef973aa3dec39b3b8b2a362fe87e2f4ef32133ac3b4097"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.7", "354c321cf377240c7b8716899e182ce4890c5938111a1296add3ec74cf1715df", [:make, :mix, :rebar3], [], "hexpm", "fe4c190e8f37401d30167c8c405eda19469f34577987c76dde613e838bbc67f8"}, "statistics": {:hex, :statistics, "0.6.3", "7fb182e7c1cab2980e392c7efef7ce326539f081f9defda4099550e9c2c7cb0f", [:mix], [], "hexpm", "a43d87726d240205e9ef47f29650a6e3132b4e4061e05512f32fa8120784a8e0"}, + "styler": {:hex, :styler, "1.4.0", "5944723d08afe4d38210b674d7e97dd1137a75968a85a633983cc308e86dc5f2", [:mix], [], "hexpm", "07de0e89c27490c8e469bb814d77ddaaa3283d7d8038501021d80a7705cf13e9"}, "table_rex": {:hex, :table_rex, "4.1.0", "fbaa8b1ce154c9772012bf445bfb86b587430fb96f3b12022d3f35ee4a68c918", [:mix], [], "hexpm", "95932701df195d43bc2d1c6531178fc8338aa8f38c80f098504d529c43bc2601"}, "telemetry": {:hex, :telemetry, "1.3.0", "fedebbae410d715cf8e7062c96a1ef32ec22e764197f70cda73d82778d61e7a2", [:rebar3], [], "hexpm", "7015fc8919dbe63764f4b4b87a95b7c0996bd539e0d499be6ec9d7f3875b79e6"}, "telemetry_metrics": {:hex, :telemetry_metrics, "0.6.2", "2caabe9344ec17eafe5403304771c3539f3b6e2f7fb6a6f602558c825d0d0bfb", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "9b43db0dc33863930b9ef9d27137e78974756f5f198cae18409970ed6fa5b561"}, diff --git a/services/app/priv/repo/seeds.exs b/services/app/priv/repo/seeds.exs index 3de6bb8d3..f2d399acb 100644 --- a/services/app/priv/repo/seeds.exs +++ b/services/app/priv/repo/seeds.exs @@ -7,8 +7,9 @@ umbrella_directory |> Enum.each(fn directory -> app_seeds = Path.join([umbrella_directory, directory, seeds_path]) - case File.exists?(app_seeds) do - true -> Mix.Tasks.Run.run([app_seeds]) - _ -> :ok + if File.exists?(app_seeds) do + Mix.Tasks.Run.run([app_seeds]) + else + :ok end end) From ca90a678b20f235ca19d17f9e58d48779aa9141c Mon Sep 17 00:00:00 2001 From: vtm Date: Fri, 21 Feb 2025 18:25:24 +0100 Subject: [PATCH 3/3] Fix linter --- .github/workflows/master.yml | 19 ++++++++----------- services/app/.credo.exs | 3 +-- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 1c2b36fcc..20d23a00a 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -42,19 +42,16 @@ jobs: otp-version: "27.2" elixir-version: "1.18.2" - - name: Restore Dependencies Cache + - name: Cache Dependencies uses: actions/cache@v4 + id: deps-cache with: - path: ./services/app/deps - key: ${{ runner.os }}-deps-${{ hashFiles('**/mix.lock') }} - restore-keys: ${{ runner.os }}-deps- - - - name: Restore Build Cache - uses: actions/cache@v4 - with: - path: ./services/app/_build - key: ${{ runner.os }}-build-${{ hashFiles('**/mix.lock') }} - restore-keys: ${{ runner.os }}-build- + path: | + ./services/app/deps + ./services/app/_build + key: ${{ runner.os }}-mix-${{ hashFiles('**/mix.lock') }} + restore-keys: | + ${{ runner.os }}-mix- - name: Get deps run: | diff --git a/services/app/.credo.exs b/services/app/.credo.exs index b257a01e5..33c474758 100644 --- a/services/app/.credo.exs +++ b/services/app/.credo.exs @@ -34,8 +34,7 @@ # You can customize the priority of any check # Priority values are: `low, normal, high, higher` # - {Credo.Check.Design.AliasUsage, - [priority: :low, if_nested_deeper_than: 4, if_called_more_often_than: 0]}, + {Credo.Check.Design.AliasUsage, [priority: :low, if_nested_deeper_than: 4, if_called_more_often_than: 0]}, # You can also customize the exit_status of each check. # If you don't want TODO comments to cause `mix credo` to fail, just # set this value to 0 (zero).