Skip to content

Commit ee18ded

Browse files
committed
Fix
1 parent 46c5fbe commit ee18ded

2 files changed

Lines changed: 71 additions & 0 deletions

File tree

apps/codebattle/lib/codebattle/group_task/context.ex

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -457,10 +457,19 @@ defmodule Codebattle.GroupTask.Context do
457457
lang: solution.lang,
458458
name: solution.user && solution.user.name,
459459
player_id: solution.user_id,
460+
submitted_at: solution_submitted_at_unix(solution.inserted_at),
460461
solution: solution.solution
461462
}
462463
end
463464

465+
defp solution_submitted_at_unix(%NaiveDateTime{} = inserted_at) do
466+
inserted_at
467+
|> DateTime.from_naive!("Etc/UTC")
468+
|> DateTime.to_unix()
469+
end
470+
471+
defp solution_submitted_at_unix(_), do: nil
472+
464473
defp solutions_not_found_payload(missing_player_ids) do
465474
%{
466475
"error" => "solutions_not_found",

apps/codebattle/test/codebattle/group_task/context_test.exs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,4 +173,66 @@ defmodule Codebattle.GroupTask.ContextTest do
173173
assert [] = all_enqueued(worker: GroupTaskSolutionRunWorker)
174174
end
175175
end
176+
177+
describe "run_group_task/3 runner payload" do
178+
setup do
179+
user = insert(:user)
180+
group_task = insert(:group_task, runner_url: "http://runner.test/api/v1/group_tasks/run")
181+
tournament = insert(:group_tournament, group_task: group_task, state: "active")
182+
183+
{:ok, _token} = Codebattle.GroupTournament.Context.create_or_rotate_token(tournament, user.id)
184+
185+
solution =
186+
insert(:group_task_solution,
187+
user: user,
188+
group_task: group_task,
189+
group_tournament: tournament,
190+
solution: "def solution():\n return 7\n",
191+
lang: "python"
192+
)
193+
194+
%{user: user, group_task: group_task, tournament: tournament, solution: solution}
195+
end
196+
197+
test "includes submitted_at as a unix timestamp for each latest solution",
198+
%{user: user, group_task: group_task, tournament: tournament, solution: solution} do
199+
assert {:ok, _run} =
200+
Context.run_group_task(group_task, [user.id], %{
201+
group_tournament_id: tournament.id,
202+
round: 1
203+
})
204+
205+
assert [payload_solution] = last_runner_solutions()
206+
207+
assert payload_solution.player_id == user.id
208+
assert payload_solution.submitted_at == expected_unix(solution.inserted_at)
209+
assert is_integer(payload_solution.submitted_at)
210+
end
211+
212+
test "includes submitted_at for hand-picked solutions passed via :solutions",
213+
%{user: user, group_task: group_task, tournament: tournament, solution: solution} do
214+
assert {:ok, _run} =
215+
Context.run_group_task(group_task, [user.id], %{
216+
group_tournament_id: tournament.id,
217+
round: 1,
218+
solutions: [solution]
219+
})
220+
221+
assert [payload_solution] = last_runner_solutions()
222+
223+
assert payload_solution.player_id == user.id
224+
assert payload_solution.submitted_at == expected_unix(solution.inserted_at)
225+
end
226+
end
227+
228+
defp last_runner_solutions do
229+
%{opts: opts} = Process.get(:group_task_runner_last_request)
230+
opts[:json].solutions
231+
end
232+
233+
defp expected_unix(%NaiveDateTime{} = inserted_at) do
234+
inserted_at
235+
|> DateTime.from_naive!("Etc/UTC")
236+
|> DateTime.to_unix()
237+
end
176238
end

0 commit comments

Comments
 (0)