diff --git a/endpoints/api_v1_controllers_STR.c b/endpoints/api_v1_controllers_STR.c
index a131ac1..0d86232 100644
--- a/endpoints/api_v1_controllers_STR.c
+++ b/endpoints/api_v1_controllers_STR.c
@@ -106,13 +106,6 @@ api_v1_controllers_STR_PUT(struct http_message *hm, endpoint_args_t *args, endpo
if(json == NULL)
{
- const char *error_ptr = cJSON_GetErrorPtr();
- if (error_ptr != NULL)
- {
- LOG_DEBUG("error before: %s\n", error_ptr);
- }
- cJSON_Delete(json);
-
static const char content[] = "no valid json was supplied";
response->status_code = 400;
response->content_type = "text/plain";
diff --git a/endpoints/api_v1_controllers_STR_relays_INT.c b/endpoints/api_v1_controllers_STR_relays_INT.c
index 0e19f7f..2d097e7 100644
--- a/endpoints/api_v1_controllers_STR_relays_INT.c
+++ b/endpoints/api_v1_controllers_STR_relays_INT.c
@@ -147,13 +147,6 @@ api_v1_controllers_STR_relays_INT_PUT(struct http_message *hm, endpoint_args_t *
if(json == NULL)
{
- const char *error_ptr = cJSON_GetErrorPtr();
- if (error_ptr != NULL)
- {
- LOG_ERROR("error before: %s\n", error_ptr);
- }
- cJSON_Delete(json);
-
static const char content[] = "no valid json was supplied";
response->status_code = 400;
response->content_type = "text/plain";
diff --git a/endpoints/api_v1_schedules.c b/endpoints/api_v1_schedules.c
index 5263c99..8b37f58 100644
--- a/endpoints/api_v1_schedules.c
+++ b/endpoints/api_v1_schedules.c
@@ -15,13 +15,6 @@ api_v1_schedules_POST(struct http_message *hm, endpoint_args_t *args, endpoint_r
if(json == NULL)
{
- const char *error_ptr = cJSON_GetErrorPtr();
- if (error_ptr != NULL)
- {
- LOG_ERROR("error before: %s\n", error_ptr);
- }
- cJSON_Delete(json);
-
static const char content[] = "no valid json was supplied";
response->status_code = 400;
response->content_type = "text/plain";
@@ -69,12 +62,30 @@ api_v1_schedules_POST(struct http_message *hm, endpoint_args_t *args, endpoint_r
if(!cJSON_IsString(json_period_start) || (json_period_start->valuestring == NULL))
{
LOG_DEBUG("period is missing start\n");
- continue;
+ cJSON_Delete(json);
+ schedule_free(new_schedule);
+
+ static const char content[] = "one period is missing a start";
+ response->status_code = 400;
+ response->content_type = "text/plain";
+ response->content_length = STRLEN(content);;
+ response->content = content;
+ response->alloced_content = false;
+ return;
}
if(!cJSON_IsString(json_period_end) || (json_period_end->valuestring == NULL))
{
LOG_DEBUG("period is missing end\n");
- continue;
+ cJSON_Delete(json);
+ schedule_free(new_schedule);
+
+ static const char content[] = "one period is missing an end";
+ response->status_code = 400;
+ response->content_type = "text/plain";
+ response->content_length = STRLEN(content);;
+ response->content = content;
+ response->alloced_content = false;
+ return;
}
uint16_t start;
@@ -82,12 +93,30 @@ api_v1_schedules_POST(struct http_message *hm, endpoint_args_t *args, endpoint_r
if(period_helper_parse_hhmm(json_period_start->valuestring, &start))
{
LOG_DEBUG("couldn't parse start '%s'\n", json_period_start->valuestring);
- continue;
+ cJSON_Delete(json);
+ schedule_free(new_schedule);
+
+ static const char content[] = "the start for one period is invalid";
+ response->status_code = 400;
+ response->content_type = "text/plain";
+ response->content_length = STRLEN(content);;
+ response->content = content;
+ response->alloced_content = false;
+ return;
}
if(period_helper_parse_hhmm(json_period_end->valuestring, &end))
{
LOG_DEBUG("couldn't parse end '%s'\n", json_period_end->valuestring);
- continue;
+ cJSON_Delete(json);
+ schedule_free(new_schedule);
+
+ static const char content[] = "the end for one period is invalid";
+ response->status_code = 400;
+ response->content_type = "text/plain";
+ response->content_length = STRLEN(content);;
+ response->content = content;
+ response->alloced_content = false;
+ return;
}
new_schedule->periods[periods_valid].start = start;
diff --git a/endpoints/api_v1_schedules_STR.c b/endpoints/api_v1_schedules_STR.c
index 3add3ae..29e68f5 100644
--- a/endpoints/api_v1_schedules_STR.c
+++ b/endpoints/api_v1_schedules_STR.c
@@ -108,13 +108,6 @@ api_v1_schedules_STR_PUT(struct http_message *hm, endpoint_args_t *args, endpoin
if(json == NULL)
{
- const char *error_ptr = cJSON_GetErrorPtr();
- if (error_ptr != NULL)
- {
- LOG_DEBUG("error before: %s\n", error_ptr);
- }
- cJSON_Delete(json);
-
static const char content[] = "no valid json was supplied";
response->status_code = 400;
response->content_type = "text/plain";
diff --git a/models/period.c b/models/period.c
index 8edfd11..a5a006a 100644
--- a/models/period.c
+++ b/models/period.c
@@ -31,6 +31,15 @@ period_helper_parse_hhmm(const char *hhmm_str, uint16_t *hhmm)
tmp_h = (uint16_t)strtol(&hhmm_str[0], NULL, 10);
tmp_m = (uint16_t)strtol(&hhmm_str[3], NULL, 10);
+ if(tmp_h > 24 || tmp_m >= 60)
+ {
+ return 1;
+ }
+ if(tmp_h == 24 && tmp_m > 0)
+ {
+ return 1;
+ }
+
*hhmm = (tmp_h * 60) + tmp_m;
return 0;
diff --git a/tests/tavern_tests/schedules_basic.tavern.yaml b/tests/tavern_tests/schedules_basic.tavern.yaml
index 0cfe93e..fe9f163 100644
--- a/tests/tavern_tests/schedules_basic.tavern.yaml
+++ b/tests/tavern_tests/schedules_basic.tavern.yaml
@@ -10,6 +10,24 @@ stages:
verify_response_with:
function: validate_schedule:multiple
+- name: "[schedules_basic] post schedule with no periods, expect it to be echoed back"
+ request:
+ method: POST
+ url: "http://localhost:5000/api/v1/schedules/"
+ json:
+ name: "same as off"
+ periods: []
+ response:
+ status_code: 201
+ verify_response_with:
+ function: validate_schedule:single
+ function: validate_schedule:check_name
+ extra_kwargs:
+ name: "{tavern.request_vars.json.name}"
+ function: validate_schedule:check_periods
+ extra_kwargs:
+ periods: "{tavern.request_vars.json.periods}"
+
- name: "[schedules_basic] post schedule, expect it to be echoed back"
request:
method: POST
@@ -67,3 +85,117 @@ stages:
url: "http://localhost:5000/api/v1/schedules/{returned_id}"
response:
status_code: 404
+
+- name: "[schedules_basic] get schedule with bad id"
+ request:
+ method: GET
+ url: "http://localhost:5000/api/v1/schedules/this_id_is_invalid"
+ response:
+ status_code: 400
+
+- name: "[schedules_basic] post schedule with bad body (no json)"
+ request:
+ method: POST
+ url: "http://localhost:5000/api/v1/schedules/"
+ data: "not jsonbut html"
+ response:
+ status_code: 400
+
+- name: "[schedules_basic] post schedule with bad body (no name)"
+ request:
+ method: POST
+ url: "http://localhost:5000/api/v1/schedules/"
+ json:
+ periods:
+ - start: "00:10"
+ end: "00:20"
+ - start: "00:30"
+ end: "00:40"
+ - start: "00:50"
+ end: "01:00"
+ response:
+ status_code: 400
+
+- name: "[schedules_basic] post schedule with bad body (name as number)"
+ request:
+ method: POST
+ url: "http://localhost:5000/api/v1/schedules/"
+ json:
+ name: 42
+ periods:
+ - start: "00:10"
+ end: "00:20"
+ - start: "00:30"
+ end: "00:40"
+ - start: "00:50"
+ end: "01:00"
+ response:
+ status_code: 400
+
+- name: "[schedules_basic] post schedule with bad period (no start)"
+ request:
+ method: POST
+ url: "http://localhost:5000/api/v1/schedules/"
+ json:
+ name: "i am invalid"
+ periods:
+ - end: "00:20"
+ - start: "00:30"
+ end: "00:40"
+ response:
+ status_code: 400
+
+- name: "[schedules_basic] post schedule with bad period (no end)"
+ request:
+ method: POST
+ url: "http://localhost:5000/api/v1/schedules/"
+ json:
+ name: "i am invalid"
+ periods:
+ - start: "00:20"
+ - start: "00:30"
+ end: "00:40"
+ response:
+ status_code: 400
+
+- name: "[schedules_basic] post schedule with bad period (invalid start)"
+ request:
+ method: POST
+ url: "http://localhost:5000/api/v1/schedules/"
+ json:
+ name: "i am invalid"
+ periods:
+ - start: "hello"
+ end: "00:20"
+ - start: "00:30"
+ end: "00:40"
+ response:
+ status_code: 400
+
+- name: "[schedules_basic] post schedule with bad period (invalid end)"
+ request:
+ method: POST
+ url: "http://localhost:5000/api/v1/schedules/"
+ json:
+ name: "i am invalid"
+ periods:
+ - start: "12:10"
+ end: 1215
+ - start: "00:30"
+ end: "00:40"
+ response:
+ status_code: 400
+
+- name: "[schedules_basic] post schedule with bad period (invalid end 2)"
+ request:
+ method: POST
+ url: "http://localhost:5000/api/v1/schedules/"
+ json:
+ name: "i am invalid"
+ periods:
+ - start: "12:10"
+ end: "25:90"
+ - start: "00:30"
+ end: "00:40"
+ response:
+ status_code: 400