• 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

29.17
/lib/cadet_web/controllers/courses_controller.ex
1
defmodule CadetWeb.CoursesController do
2
  use CadetWeb, :controller
3

4
  use PhoenixSwagger
5

6
  alias Cadet.Courses
7
  alias Cadet.Accounts.CourseRegistrations
8

9
  def index(conn, %{"course_id" => course_id}) when is_ecto_id(course_id) do
UNCOV
10
    case Courses.get_course_config(course_id) do
×
11
      {:ok, config} ->
NEW
12
        if conn.assigns.course_reg.role == :admin || conn.assigns.course_reg.role == "admin" do
×
NEW
13
          render(conn, "config_admin.json", config: config)
×
14
        else
NEW
15
          render(conn, "config.json", config: config)
×
16
        end
17

18
      # coveralls-ignore-start
19
      # no course error will not happen here
20
      {:error, {status, message}} ->
21
        send_resp(conn, status, message)
22
        # coveralls-ignore-stop
23
    end
24
  end
25

26
  def create(conn, params) do
UNCOV
27
    user = conn.assigns.current_user
×
UNCOV
28
    params = params |> to_snake_case_atom_keys()
×
29

UNCOV
30
    if user.super_admin or CourseRegistrations.get_admin_courses_count(user) < 5 do
×
UNCOV
31
      case Courses.create_course_config(params, user) do
×
32
        {:ok, _} ->
UNCOV
33
          text(conn, "OK")
×
34

35
        {:error, _, _, _} ->
36
          conn
37
          |> put_status(:bad_request)
UNCOV
38
          |> text("Invalid parameter(s)")
×
39
      end
40
    else
41
      conn
42
      |> put_status(:forbidden)
UNCOV
43
      |> text("User not allowed to be admin of more than 5 courses.")
×
44
    end
45
  end
46

47
  def check_resume_code(conn, %{"course_id" => course_id}) when is_ecto_id(course_id) do
NEW
48
    params = conn.body_params
×
NEW
49
    resume_code = Map.get(params, "resume_code", nil)
×
50

NEW
51
    case Courses.get_course_config(course_id) do
×
52
      {:ok, config} ->
NEW
53
        if config.resume_code == resume_code do
×
NEW
54
          send_resp(conn, 200, "Resume code is correct.")
×
55
        else
NEW
56
          send_resp(conn, 403, "Resume code is wrong.")
×
57
        end
58

59
      # coveralls-ignore-start
60
      # no course error will not happen here
61
      {:error, {status, message}} ->
62
        send_resp(conn, status, message)
63
        # coveralls-ignore-stop
64
    end
65
  end
66

67
  swagger_path :create do
1✔
68
    post("/config/create")
69

70
    summary("Creates a new course")
71

72
    security([%{JWT: []}])
73
    consumes("application/json")
74

75
    parameters do
76
      course_name(:body, :string, "Course name", required: true)
77
      course_short_name(:body, :string, "Course module code", required: true)
78
      viewable(:body, :boolean, "Course viewability", required: true)
79
      enable_game(:body, :boolean, "Enable game", required: true)
80
      enable_achievements(:body, :boolean, "Enable achievements", required: true)
81
      enable_sourcecast(:body, :boolean, "Enable sourcecast", required: true)
82
      enable_stories(:body, :boolean, "Enable stories", required: true)
83
      enable_exam_mode(:body, :boolean, "Enable exam mode", required: true)
84
      source_chapter(:body, :number, "Default source chapter", required: true)
85

86
      source_variant(:body, Schema.ref(:SourceVariant), "Default source variant name",
87
        required: true
88
      )
89

90
      module_help_text(:body, :string, "Module help text", required: true)
91
    end
92
  end
93

94
  swagger_path :index do
1✔
95
    get("/courses/{course_id}/config")
96

97
    summary("Retrieves the course configuration of the specified course")
98

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

101
    produces("application/json")
102

103
    parameters do
104
      course_id(:path, :integer, "Course ID", required: true)
105
    end
106

107
    response(200, "OK", Schema.ref(:Config))
108
    response(400, "Invalid course_id")
109
  end
110

111
  def swagger_definitions do
112
    %{
1✔
113
      Config:
114
        swagger_schema do
1✔
115
          title("Course Configuration")
116

117
          properties do
1✔
118
            course_name(:string, "Course name", required: true)
119
            course_short_name(:string, "Course module code", required: true)
120
            viewable(:boolean, "Course viewability", required: true)
121
            enable_game(:boolean, "Enable game", required: true)
122
            enable_achievements(:boolean, "Enable achievements", required: true)
123
            enable_sourcecast(:boolean, "Enable sourcecast", required: true)
124
            enable_stories(:boolean, "Enable stories", required: true)
125
            enable_exam_mode(:boolean, "Enable exam mode", required: true)
126
            source_chapter(:integer, "Source Chapter number from 1 to 4", required: true)
127
            source_variant(Schema.ref(:SourceVariant), "Source Variant name", required: true)
128
            module_help_text(:string, "Module help text", required: true)
129
            assessment_types(:list, "Assessment Types", required: true)
1✔
130
          end
131

132
          example(%{
133
            course_name: "Programming Methodology",
134
            course_short_name: "CS1101S",
135
            viewable: true,
136
            enable_game: true,
137
            enable_achievements: true,
138
            enable_sourcecast: true,
139
            enable_stories: false,
140
            source_chapter: 1,
141
            source_variant: "default",
142
            module_help_text: "Help text",
143
            assessment_types: ["Missions", "Quests", "Paths", "Contests", "Others"]
144
          })
145
        end,
146
      SourceVariant:
147
        swagger_schema do
1✔
148
          type(:string)
149
          enum([:default, :concurrent, :gpu, :lazy, "non-det", :wasm])
150
        end
151
    }
152
  end
153
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

© 2025 Coveralls, Inc