< Summary - Backend C Tests - Coverage Report

Information
Class: test_machine_handler_c
Assembly: src.backend.tests.unit
File(s): C:\Users\yagiz\Desktop\Project\smart-maintenance-suite\src\backend\tests\unit\test_machine_handler.c
Line coverage
100%
Covered lines: 86
Uncovered lines: 0
Coverable lines: 86
Total lines: 154
Line coverage: 100%
Branch coverage
53%
Covered branches: 15
Total branches: 28
Branch coverage: 53.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_all_machines100%00100%
add_machine100%00100%
serialize_machines_to_json100%00100%
test_get_request50%00100%
test_post_success50%00100%
test_invalid_json50%00100%
test_missing_fields50%00100%
test_duplicate_machine50%00100%
test_add_machine_failure50%00100%
main100%00100%

File(s)

C:\Users\yagiz\Desktop\Project\smart-maintenance-suite\src\backend\tests\unit\test_machine_handler.c

#LineLine coverage
 1#define _GNU_SOURCE
 2#include <stdio.h>
 3#include <string.h>
 4#include <assert.h>
 5#include <stdlib.h>
 6#include <stdbool.h>
 7
 8#include "../../api/handlers/machine_handler.h"
 9
 10/* ==========================================================
 11   MOCK STATE
 12   ========================================================== */
 13
 14static int mock_duplicate_mode = 0;
 15static int mock_add_machine_success = 1;
 16
 17/* ==========================================================
 18   MOCK STRUCTS
 19   ========================================================== */
 20
 21typedef struct {
 22  int id;
 23  char name[100];
 24  char model[100];
 25  char location[100];
 26  char status[50];
 27} Machine;
 28
 29/* ==========================================================
 30   MOCK FUNCTIONS
 31   ========================================================== */
 32
 333int get_all_machines(Machine *list, int max) {
 334  if (!mock_duplicate_mode)
 235    return 0;
 36
 137  strcpy(list[0].name, "CNC Machine");
 138  return 1;
 39}
 40
 241bool add_machine(const char *name,
 42                 const char *model,
 43                 const char *location,
 44                 const char *status) {
 45  (void)name;
 46  (void)model;
 47  (void)location;
 48  (void)status;
 249  return mock_add_machine_success;
 50}
 51
 52/* ==========================================================
 53   MOCK SERIALIZER (for GET)
 54   ========================================================== */
 55
 156char *serialize_machines_to_json(void) {
 157  char *json = malloc(128);
 158  strcpy(json, "{\"machines\":[{\"id\":1,\"name\":\"CNC Machine\"}]}");
 159  return json;
 60}
 61
 62/* ==========================================================
 63   TESTS
 64   ========================================================== */
 65
 166void test_get_request() {
 167  HttpRequest req = {0};
 168  HttpResponse res = {0};
 169  strcpy(req.method, "GET");
 170  handle_machine_request(&req, &res);
 171  assert(res.status_code == 200);
 172  assert(strcmp(res.content_type, "application/json") == 0);
 173  assert(strstr(res.body, "CNC Machine") != NULL);
 174  printf("✔ test_get_request\n");
 175}
 76
 177void test_post_success() {
 178  HttpRequest req = {0};
 179  HttpResponse res = {0};
 180  strcpy(req.method, "POST");
 181  strcpy(req.body,
 82         "{\"name\":\"Drill\",\"model\":\"X1\",\"location\":\"Hall A\",\"status\":\"running\"}");
 183  mock_duplicate_mode = 0;
 184  mock_add_machine_success = 1;
 185  handle_machine_request(&req, &res);
 186  assert(res.status_code == 201);
 187  assert(strstr(res.body, "success") != NULL);
 188  printf("✔ test_post_success\n");
 189}
 90
 191void test_invalid_json() {
 192  HttpRequest req = {0};
 193  HttpResponse res = {0};
 194  strcpy(req.method, "POST");
 195  strcpy(req.body, "INVALID_JSON");
 196  handle_machine_request(&req, &res);
 197  assert(res.status_code == 400);
 198  assert(strstr(res.body, "Invalid JSON") != NULL);
 199  printf("✔ test_invalid_json\n");
 1100}
 101
 1102void test_missing_fields() {
 1103  HttpRequest req = {0};
 1104  HttpResponse res = {0};
 1105  strcpy(req.method, "POST");
 1106  strcpy(req.body, "{\"name\":\"OnlyName\"}");
 1107  handle_machine_request(&req, &res);
 1108  assert(res.status_code == 400);
 1109  assert(strstr(res.body, "Missing required fields") != NULL);
 1110  printf("✔ test_missing_fields\n");
 1111}
 112
 1113void test_duplicate_machine() {
 1114  HttpRequest req = {0};
 1115  HttpResponse res = {0};
 1116  strcpy(req.method, "POST");
 1117  strcpy(req.body,
 118         "{\"name\":\"CNC Machine\",\"status\":\"running\"}");
 1119  mock_duplicate_mode = 1;
 1120  mock_add_machine_success = 1;
 1121  handle_machine_request(&req, &res);
 1122  assert(res.status_code == 409);
 1123  assert(strstr(res.body, "already exists") != NULL);
 1124  printf("✔ test_duplicate_machine\n");
 1125}
 126
 1127void test_add_machine_failure() {
 1128  HttpRequest req = {0};
 1129  HttpResponse res = {0};
 1130  strcpy(req.method, "POST");
 1131  strcpy(req.body,
 132         "{\"name\":\"NewMachine\",\"status\":\"running\"}");
 1133  mock_duplicate_mode = 0;
 1134  mock_add_machine_success = 0;
 1135  handle_machine_request(&req, &res);
 1136  assert(res.status_code == 500);
 1137  assert(strstr(res.body, "Database error") != NULL);
 1138  printf("✔ test_add_machine_failure\n");
 1139}
 140
 141/* ==========================================================
 142   MAIN
 143   ========================================================== */
 144
 1145int main() {
 1146  test_get_request();
 1147  test_post_success();
 1148  test_invalid_json();
 1149  test_missing_fields();
 1150  test_duplicate_machine();
 1151  test_add_machine_failure();
 1152  printf("\nALL machine_handler tests passed.\n");
 1153  return 0;
 154}