• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

source-academy / backend / e0330f2cf38b2d8af12bffd20f4cac2158d607fc-PR-1236

31 Mar 2025 09:12AM UTC coverage: 19.982% (-73.6%) from 93.607%
e0330f2cf38b2d8af12bffd20f4cac2158d607fc-PR-1236

Pull #1236

github

RichDom2185
Redate migrations to maintain total ordering
Pull Request #1236: Added Exam mode

12 of 57 new or added lines in 8 files covered. (21.05%)

2430 existing lines in 97 files now uncovered.

671 of 3358 relevant lines covered (19.98%)

3.03 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

28.57
/lib/cadet_web/admin_controllers/admin_courses_controller.ex
1
defmodule CadetWeb.AdminCoursesController do
2
  use CadetWeb, :controller
3

4
  use PhoenixSwagger
5

6
  alias Cadet.Courses
7

8
  def update_course_config(conn, params = %{"course_id" => course_id})
9
      when is_ecto_id(course_id) do
UNCOV
10
    params = params |> to_snake_case_atom_keys()
×
11

UNCOV
12
    case Courses.update_course_config(course_id, params) do
×
13
      {:ok, _} ->
UNCOV
14
        text(conn, "OK")
×
15

16
      # coveralls-ignore-start
17
      # case of invalid course_id will not happen here
18
      {:error, {status, message}} ->
19
        send_resp(conn, status, message)
20

21
      # coveralls-ignore-stop
22

23
      {:error, _} ->
24
        conn
25
        |> put_status(:bad_request)
UNCOV
26
        |> text("Invalid parameter(s)")
×
27
    end
28
  end
29

30
  def get_assessment_configs(conn, %{"course_id" => course_id}) when is_ecto_id(course_id) do
UNCOV
31
    assessment_configs = Courses.get_assessment_configs(course_id)
×
UNCOV
32
    render(conn, "assessment_configs.json", %{configs: assessment_configs})
×
33
  end
34

35
  def update_assessment_configs(conn, %{
36
        "course_id" => course_id,
37
        "assessmentConfigs" => assessment_configs
38
      })
39
      when is_ecto_id(course_id) and is_list(assessment_configs) do
UNCOV
40
    if Enum.all?(assessment_configs, &is_map/1) do
×
41
      # coveralls-ignore-start
42
      configs =
43
        assessment_configs
44
        |> Enum.map(&to_snake_case_atom_keys/1)
45
        |> update_in(
46
          [Access.all()],
47
          &with(
48
            {v, m} <- Map.pop(&1, :display_in_dashboard),
49
            do: Map.put(m, :show_grading_summary, v)
50
          )
51
        )
52

53
      # coveralls-ignore-stop
54

UNCOV
55
      case Courses.mass_upsert_and_reorder_assessment_configs(course_id, configs) do
×
56
        {:ok, _} ->
UNCOV
57
          text(conn, "OK")
×
58

59
        {:error, {status, message}} ->
60
          conn
61
          |> put_status(status)
UNCOV
62
          |> text(message)
×
63
      end
64
    else
UNCOV
65
      send_resp(
×
66
        conn,
67
        :bad_request,
68
        "assessmentConfigs should be a list of assessment configuration objects"
69
      )
70
    end
71
  end
72

73
  def update_assessment_configs(conn, _) do
UNCOV
74
    send_resp(conn, :bad_request, "missing assessmentConfig")
×
75
  end
76

77
  def delete_assessment_config(conn, %{
78
        "course_id" => course_id,
79
        "assessment_config_id" => assessment_config_id
80
      })
81
      when is_ecto_id(course_id) and is_ecto_id(assessment_config_id) do
UNCOV
82
    case Courses.delete_assessment_config(course_id, assessment_config_id) do
×
83
      {:ok, _} ->
UNCOV
84
        text(conn, "OK")
×
85

86
      {:error, message} ->
87
        conn
88
        |> put_status(:bad_request)
UNCOV
89
        |> text(message)
×
90
    end
91
  end
92

93
  swagger_path :update_course_config do
1✔
94
    put("/courses/{course_id}/admin/config")
95

96
    summary("Updates the course configuration for the specified course")
97

98
    security([%{JWT: []}])
99

100
    consumes("application/json")
101

102
    parameters do
103
      course_id(:path, :integer, "Course ID", required: true)
104
      course_name(:body, :string, "Course name")
105
      course_short_name(:body, :string, "Course module code")
106
      viewable(:body, :boolean, "Course viewability")
107
      enable_game(:body, :boolean, "Enable game")
108
      enable_achievements(:body, :boolean, "Enable achievements")
109
      enable_sourcecast(:body, :boolean, "Enable sourcecast")
110
      enable_stories(:body, :boolean, "Enable stories")
111
      enable_exam_mode(:body, :boolean, "Enable exam mode")
112
      resume_code(:body, :string, "Resume code when attempt to open DevTool is detected")
113
      sublanguage(:body, Schema.ref(:AdminSublanguage), "sublanguage object")
114
      module_help_text(:body, :string, "Module help text")
115
    end
116

117
    response(200, "OK")
118
    response(400, "Missing or invalid parameter(s)")
119
    response(403, "Forbidden")
120
  end
121

122
  swagger_path :update_assessment_configs do
1✔
123
    put("/courses/{course_id}/admin/config/assessment_configs")
124

125
    summary("Updates the assessment configuration for the specified course")
126

127
    security([%{JWT: []}])
128

129
    consumes("application/json")
130

131
    parameters do
132
      course_id(:path, :integer, "Course ID", required: true)
133
      assessment_configs(:body, :list, "Assessment Configs")
134
    end
135

136
    response(200, "OK")
137
    response(400, "Missing or invalid parameter(s)")
138
    response(403, "Forbidden")
139
  end
140

141
  def swagger_definitions do
142
    %{
1✔
143
      AdminSublanguage:
144
        swagger_schema do
1✔
145
          title("AdminSublanguage")
146

147
          properties do
1✔
148
            chapter(:integer, "Chapter number from 1 to 4", required: true, minimum: 1, maximum: 4)
149

150
            variant(Schema.ref(:SourceVariant), "Variant name", required: true)
1✔
151
          end
152

153
          example(%{
154
            chapter: 2,
155
            variant: "lazy"
156
          })
157
        end
158
    }
159
  end
160
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc