< Summary - Backend C Tests - Coverage Report

Information
Class: inventory_handler_c
Assembly: src.backend.api.handlers
File(s): C:\Users\yagiz\Desktop\Project\smart-maintenance-suite\src\backend\api\handlers\inventory_handler.c
Line coverage
72%
Covered lines: 34
Uncovered lines: 13
Coverable lines: 47
Total lines: 80
Line coverage: 72.3%
Branch coverage
62%
Covered branches: 15
Total branches: 24
Branch coverage: 62.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
handle_inventory_request62.5%0072.34%

File(s)

C:\Users\yagiz\Desktop\Project\smart-maintenance-suite\src\backend\api\handlers\inventory_handler.c

#LineLine coverage
 1#include "inventory_handler.h"
 2#include "../../database/api_handlers.h"
 3#include "../../database/cJSON.h"
 4#include <string.h>
 5#include <stdlib.h>
 6#include <stdio.h>
 7
 8// Using definition from database/api_handlers.c
 9
 10#include "../../database/inventory_service.h"
 11
 312void handle_inventory_request(HttpRequest *req, HttpResponse *res) {
 313  if (strcmp(req->method, "GET") == 0) {
 114    char *json = serialize_inventory_to_json();
 115    res->status_code = 200;
 116    strcpy(res->content_type, "application/json");
 117    strncpy(res->body, json, 8191);
 118    res->body[8191] = '\0';
 119    free(json);
 220  } else if (strcmp(req->method, "POST") == 0) {
 121    cJSON *root = cJSON_Parse(req->body);
 22
 123    if (root) {
 124      cJSON *name_item = cJSON_GetObjectItem(root, "part_name");
 125      cJSON *sku_item = cJSON_GetObjectItem(root, "sku");
 126      cJSON *qty_item = cJSON_GetObjectItem(root, "quantity");
 127      cJSON *min_item = cJSON_GetObjectItem(root, "min_stock");
 128      cJSON *cost_item = cJSON_GetObjectItem(root, "cost");
 29
 230      if (name_item && sku_item) {
 131        const char *name = name_item->valuestring;
 132        const char *sku = sku_item->valuestring;
 133        int qty = qty_item ? qty_item->valueint : 0;
 134        int min = min_item ? min_item->valueint : 5;
 135        double cost = cost_item ? cost_item->valuedouble : 0.0;
 36        // --- DUPLICATE CHECK (SKU) ---
 37        InventoryItem items[100];
 138        int count = get_all_inventory(items, 100);
 139        bool duplicate = false;
 40
 241        for (int i = 0; i < count; i++) {
 142          if (strcmp(items[i].sku, sku) == 0) {
 043            duplicate = true;
 044            break;
 45          }
 46        }
 47
 148        if (duplicate) {
 049          res->status_code = 409;
 050          strcpy(res->content_type, "application/json");
 051          strcpy(res->body, "{\"error\": \"An item with this SKU already exists in inventory.\"}");
 052          cJSON_Delete(root);
 053          return;
 54        }
 55
 56        // -----------------------------
 57
 158        if (add_inventory_item(name, sku, qty, min, cost)) {
 159          res->status_code = 201;
 160          strcpy(res->content_type, "application/json");
 161          strcpy(res->body, "{\"success\": true, \"message\": \"Inventory item added successfully\"}");
 62        } else {
 063          res->status_code = 500;
 064          strcpy(res->body, "{\"error\": \"Database error while adding inventory item\"}");
 65        }
 66      } else {
 067        res->status_code = 400;
 068        strcpy(res->body, "{\"error\": \"Missing required fields: part_name, sku\"}");
 69      }
 70
 171      cJSON_Delete(root);
 72    } else {
 073      res->status_code = 400;
 074      strcpy(res->body, "{\"error\": \"Invalid JSON\"}");
 75    }
 76  } else {
 177    res->status_code = 405;
 178    strcpy(res->body, "{\"error\": \"Method not supported\"}");
 79  }
 80}

Methods/Properties

handle_inventory_request