add: tests

This commit is contained in:
Tobias Reisinger 2020-06-01 00:45:08 +02:00
parent 760cec9a20
commit 865caa627e
15 changed files with 558 additions and 386 deletions

View file

@ -1,3 +1,5 @@
#include <arpa/inet.h>
#include <cJSON.h>
#include <macros.h>
#include <command.h>
@ -74,35 +76,66 @@ api_v1_controllers_STR_PUT(struct mg_connection *nc, struct http_message *hm, en
{
static const char content[] = "no valid json was supplied";
endpoint_response_text(response, 400, content, STRLEN(content));
controller_free(controller);
return;
}
cJSON *json_name = cJSON_GetObjectItemCaseSensitive(json, "name");
if(cJSON_IsString(json_name) && json_name->valuestring)
if(json_name)
{
strncpy(controller->name, json_name->valuestring, MAX_NAME_LENGTH);
controller->name[MAX_NAME_LENGTH] = '\0';
if(cJSON_IsString(json_name) && json_name->valuestring)
{
strncpy(controller->name, json_name->valuestring, MAX_NAME_LENGTH);
controller->name[MAX_NAME_LENGTH] = '\0';
}
else
{
static const char content[] = "the given name is no valid string";
endpoint_response_text(response, 400, content, STRLEN(content));
cJSON_Delete(json);
controller_free(controller);
return;
}
}
cJSON *json_ip = cJSON_GetObjectItemCaseSensitive(json, "ip");
if(cJSON_IsString(json_ip) && json_ip->valuestring)
if(json_ip)
{
strncpy(controller->ip, json_ip->valuestring, IP_LENGTH);
controller->ip[IP_LENGTH] = '\0';
if(cJSON_IsString(json_ip) && json_ip->valuestring)
{
unsigned char buf[sizeof(struct in_addr)];
if(inet_pton(AF_INET, json_ip->valuestring, buf))
{
strncpy(controller->ip, json_ip->valuestring, IP_LENGTH);
controller->ip[IP_LENGTH] = '\0';
}
else
{
static const char content[] = "the given ip address is no valid IPv4 address";
endpoint_response_text(response, 400, content, STRLEN(content));
cJSON_Delete(json);
controller_free(controller);
return;
}
}
else
{
static const char content[] = "the given ip address is no valid string";
endpoint_response_text(response, 400, content, STRLEN(content));
cJSON_Delete(json);
controller_free(controller);
return;
}
}
if(controller_save(controller))
{
LOG_ERROR("failed to save controller\n");
free(controller);
controller_free(controller);
cJSON_Delete(json);
static const char content[] = "failed to save controller to database";
response->status_code = 500;
response->content_type = "text/plain";
response->content_length = STRLEN(content);;
response->content = content;
response->alloced_content = false;
endpoint_response_text(response, 500, content, STRLEN(content));
return;
}
@ -111,26 +144,7 @@ api_v1_controllers_STR_PUT(struct mg_connection *nc, struct http_message *hm, en
command_set_controller_name(controller);
char *json_str = cJSON_Print(json);
if (json_str == NULL)
{
LOG_ERROR("failed to print controller json\n");
static const char content[] = "failed to print json for controller";
response->status_code = 500;
response->content_type = "text/plain";
response->content_length = STRLEN(content);;
response->content = content;
response->alloced_content = false;
}
else
{
response->status_code = 200;
response->content_type = "application/json";
response->content_length = strlen(json_str);
response->content = json_str;
response->alloced_content = true;
}
endpoint_response_json(response, 200, json);
cJSON_Delete(json);
controller_free(controller);
}
@ -149,11 +163,7 @@ api_v1_controllers_STR_DELETE(struct mg_connection *nc, struct http_message *hm,
LOG_DEBUG("failed to unparse uid\n");
static const char content[] = "given id was invalid";
response->status_code = 400;
response->content_type = "text/plain";
response->content_length = STRLEN(content);;
response->content = content;
response->alloced_content = false;
endpoint_response_text(response, 400, content, STRLEN(content));
return;
}
@ -164,11 +174,7 @@ api_v1_controllers_STR_DELETE(struct mg_connection *nc, struct http_message *hm,
LOG_DEBUG("could not find a controller for uid '%s'\n", args[0].value.v_str);
static const char content[] = "no controller for id found";
response->status_code = 404;
response->content_type = "text/plain";
response->content_length = STRLEN(content);;
response->content = content;
response->alloced_content = false;
endpoint_response_text(response, 404, content, STRLEN(content));
return;
}
@ -177,19 +183,11 @@ api_v1_controllers_STR_DELETE(struct mg_connection *nc, struct http_message *hm,
LOG_ERROR("failed to remove controller from database\n");
static const char content[] = "failed to remove controller from database";
response->status_code = 500;
response->content_type = "text/plain";
response->content_length = STRLEN(content);;
response->content = content;
response->alloced_content = false;
endpoint_response_text(response, 500, content, STRLEN(content));
}
else
{
response->status_code = 200;
response->content_type = "application/json";
response->content_length = 0;
response->content = "";
response->alloced_content = false;
endpoint_response_text(response, 200, "", 0);
}
controller_free(controller);
return;

View file

@ -31,8 +31,31 @@ api_v1_schedules_POST(struct mg_connection *nc, struct http_message *hm, endpoin
endpoint_response_text(response, 400, content, STRLEN(content));
return;
}
cJSON *json_period;
cJSON *json_periods = cJSON_GetObjectItemCaseSensitive(json, "periods");
if(!cJSON_IsArray(json_periods))
{
LOG_DEBUG("no periods for schedule provided\n");
cJSON_Delete(json);
static const char content[] = "no periods for schedule provided";
endpoint_response_text(response, 400, content, STRLEN(content));
return;
}
cJSON *json_tag;
cJSON *json_tags = cJSON_GetObjectItemCaseSensitive(json, "tags");
cJSON_ArrayForEach(json_tag, json_tags)
{
if(!cJSON_IsString(json_tag) || (json_tag->valuestring == NULL))
{
LOG_DEBUG("invalid tag in tags\n");
cJSON_Delete(json);
static const char content[] = "invalid tag in tags";
endpoint_response_text(response, 400, content, STRLEN(content));
return;
}
}
schedule_t *new_schedule = malloc(sizeof(schedule_t));
@ -47,6 +70,7 @@ api_v1_schedules_POST(struct mg_connection *nc, struct http_message *hm, endpoin
int periods_valid = 0;
cJSON *json_period;
cJSON_ArrayForEach(json_period, json_periods)
{
cJSON *json_period_start = cJSON_GetObjectItemCaseSensitive(json_period, "start");
@ -106,23 +130,18 @@ api_v1_schedules_POST(struct mg_connection *nc, struct http_message *hm, endpoin
schedule_save(new_schedule);
junction_tag_remove_for_schedule(new_schedule->id);
cJSON *json_tag;
cJSON *json_tags = cJSON_GetObjectItemCaseSensitive(json, "tags");
json_tags = cJSON_GetObjectItemCaseSensitive(json, "tags");
cJSON_ArrayForEach(json_tag, json_tags)
{
if(!cJSON_IsString(json_tag) || (json_tag->valuestring == NULL))
{
LOG_DEBUG("invalid tag in tags\n");
continue;
}
const char *tag = json_tag->valuestring;
int tag_id = tag_get_id(tag);
if(tag_id == 0)
{
tag_save(tag_id, tag);
tag_id = tag_get_id(tag);
}
junction_tag_insert(tag_id, 0, new_schedule->id);
const char *tag = json_tag->valuestring;
int tag_id = tag_get_id(tag);
if(tag_id == 0)
{
tag_save(tag_id, tag);
tag_id = tag_get_id(tag);
}
junction_tag_insert(tag_id, 0, new_schedule->id);
}
cJSON_Delete(json);