< Summary - Backend C Tests - Coverage Report (WSL)

Information
Class: test_inventory_service_real_c
Assembly: src.backend.tests.unit.database
File(s): ./src/backend/tests/unit/database/test_inventory_service_real.c
Line coverage
97%
Covered lines: 107
Uncovered lines: 3
Coverable lines: 110
Total lines: 228
Line coverage: 97.2%
Branch coverage
83%
Covered branches: 10
Total branches: 12
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100 2/18/2026 - 10:50:55 PM Line coverage: 97.2% (107/110) Branch coverage: 83.3% (10/12) Total lines: 228 2/18/2026 - 10:50:55 PM Line coverage: 97.2% (107/110) Branch coverage: 83.3% (10/12) Total lines: 228

File(s)

./src/backend/tests/unit/database/test_inventory_service_real.c

#LineLine coverage
 1#include <stdarg.h>
 2#include <stddef.h>
 3#include <setjmp.h>
 4#include <cmocka.h>
 5#include <string.h>
 6#include <stdio.h>
 7#include <stdlib.h>
 8
 9// ÖNEMLİ: libpq-fe.h'i include ETME!
 10#define PGconn void
 11#define PGresult void
 12
 13#define LIBPQ_FE_H
 14#define PQconninfoOption void
 15#define ConnStatusType int
 16#define ExecStatusType int
 17#define CONNECTION_OK 0
 18#define CONNECTION_BAD 1
 19#define PGRES_COMMAND_OK 1
 20#define PGRES_TUPLES_OK 2
 21#define PGRES_FATAL_ERROR 3
 22
 23#include "inventory_service.h"
 24#include "db_connection.h"
 25
 26// Logger mock'larını manuel tanımla
 27#undef LOG_ERROR
 28#undef LOG_INFO
 29#define LOG_ERROR(msg, ...)
 30#define LOG_INFO(msg, ...)
 31
 32/* ====================================================================
 33 * MOCK FONKSİYONLAR
 34 * ==================================================================== */
 35
 36static DBConnection mock_conn;
 37static void *mock_result;
 38static int mock_acquire_success = 1;
 39static int mock_result_status = 2; // PGRES_TUPLES_OK
 40static char mock_error_message[256] = "";
 41static char mock_query[1024] = "";
 42
 43static int mock_acquire_called = 0;
 44static int mock_release_called = 0;
 45static int mock_pqexec_called = 0;
 46static int mock_pqclear_called = 0;
 47static int mock_pqntuples_called = 0;
 48
 49typedef struct {
 50  char id[10];
 51  char part_name[100];
 52  char sku[50];
 53  char quantity[10];
 54  char min_stock[10];
 55  char unit_cost[20];
 56  char last_restocked[32];
 57} MockRow;
 58
 59static MockRow mock_rows[10];
 60static int mock_row_count = 0;
 61
 462DBConnection *db_pool_acquire(void) {
 463  mock_acquire_called++;
 64
 465  if (mock_acquire_success) {
 366    mock_conn.pg_conn = (void *)0x1234;
 367    return &mock_conn;
 68  }
 69
 170  return NULL;
 71}
 72
 373void db_pool_release(DBConnection *conn) {
 374  mock_release_called++;
 375}
 76
 377void *PQexec(void *conn, const char *query) {
 378  mock_pqexec_called++;
 379  strncpy(mock_query, query, sizeof(mock_query) - 1);
 380  return mock_result;
 81}
 82
 383int PQresultStatus(const void *res) {
 384  return mock_result_status;
 85}
 86
 087char *PQerrorMessage(const void *conn) {
 088  return mock_error_message;
 89}
 90
 391void PQclear(void *res) {
 392  mock_pqclear_called++;
 393}
 94
 295int PQntuples(const void *res) {
 296  mock_pqntuples_called++;
 297  return mock_row_count;
 98}
 99
 28100char *PQgetvalue(const void *res, int row, int field) {
 28101  if (row < mock_row_count) {
 28102    switch (field) {
 4103      case 0:
 4104        return mock_rows[row].id;
 105
 4106      case 1:
 4107        return mock_rows[row].part_name;
 108
 4109      case 2:
 4110        return mock_rows[row].sku;
 111
 4112      case 3:
 4113        return mock_rows[row].quantity;
 114
 4115      case 4:
 4116        return mock_rows[row].min_stock;
 117
 4118      case 5:
 4119        return mock_rows[row].unit_cost;
 120
 4121      case 6:
 4122        return mock_rows[row].last_restocked;
 123    }
 124  }
 125
 0126  return "";
 127}
 128
 129/* ====================================================================
 130 * TEST SETUP
 131 * ==================================================================== */
 132
 5133static void reset_mocks(void) {
 5134  mock_acquire_success = 1;
 5135  mock_result_status = 2; // PGRES_TUPLES_OK
 5136  mock_error_message[0] = '\0';
 5137  mock_query[0] = '\0';
 5138  mock_acquire_called = 0;
 5139  mock_release_called = 0;
 5140  mock_pqexec_called = 0;
 5141  mock_pqclear_called = 0;
 5142  mock_pqntuples_called = 0;
 5143  mock_row_count = 0;
 5144  memset(mock_rows, 0, sizeof(mock_rows));
 5145}
 146
 2147static void setup_test_data(void) {
 2148  mock_row_count = 2;
 2149  strcpy(mock_rows[0].id, "1");
 2150  strcpy(mock_rows[0].part_name, "Motor Oil");
 2151  strcpy(mock_rows[0].sku, "MO-001");
 2152  strcpy(mock_rows[0].quantity, "50");
 2153  strcpy(mock_rows[0].min_stock, "10");
 2154  strcpy(mock_rows[0].unit_cost, "25.50");
 2155  strcpy(mock_rows[0].last_restocked, "2025-01-01");
 2156  strcpy(mock_rows[1].id, "2");
 2157  strcpy(mock_rows[1].part_name, "Air Filter");
 2158  strcpy(mock_rows[1].sku, "AF-002");
 2159  strcpy(mock_rows[1].quantity, "5");
 2160  strcpy(mock_rows[1].min_stock, "10");
 2161  strcpy(mock_rows[1].unit_cost, "15.75");
 2162  strcpy(mock_rows[1].last_restocked, "2025-01-02");
 2163}
 164
 165/* ====================================================================
 166 * TEST CASES
 167 * ==================================================================== */
 168
 1169static void test_get_all_inventory_success(void **state) {
 1170  reset_mocks();
 1171  setup_test_data();
 172  InventoryItem items[5];
 1173  int count = get_all_inventory(items, 5);
 1174  assert_int_equal(count, 2);
 1175  assert_int_equal(mock_acquire_called, 1);
 1176  assert_int_equal(mock_pqexec_called, 1);
 1177  assert_int_equal(items[0].id, 1);
 1178  assert_string_equal(items[0].part_name, "Motor Oil");
 1179  assert_int_equal(items[0].quantity, 50);
 1180}
 181
 1182static void test_get_all_inventory_null_items(void **state) {
 1183  reset_mocks();
 1184  int count = get_all_inventory(NULL, 5);
 1185  assert_int_equal(count, 0);
 1186  assert_int_equal(mock_acquire_called, 0);
 1187}
 188
 1189static void test_get_all_inventory_acquire_fails(void **state) {
 1190  reset_mocks();
 1191  mock_acquire_success = 0;
 192  InventoryItem items[5];
 1193  int count = get_all_inventory(items, 5);
 1194  assert_int_equal(count, 0);
 1195}
 196
 1197static void test_update_inventory_success(void **state) {
 1198  reset_mocks();
 1199  mock_result_status = 1; // PGRES_COMMAND_OK
 1200  bool result = update_inventory_quantity(1, 10);
 1201  assert_true(result);
 1202  assert_int_equal(mock_pqexec_called, 1);
 1203}
 204
 1205static void test_get_low_stock_success(void **state) {
 1206  reset_mocks();
 1207  setup_test_data();
 208  InventoryItem items[5];
 1209  int count = get_low_stock_items(items, 5);
 1210  assert_int_equal(count, 2);
 1211}
 212
 213/* ====================================================================
 214 * MAIN
 215 * ==================================================================== */
 216
 1217int main(void) {
 1218  const struct CMUnitTest tests[] = {
 219    cmocka_unit_test(test_get_all_inventory_success),
 220    cmocka_unit_test(test_get_all_inventory_null_items),
 221    cmocka_unit_test(test_get_all_inventory_acquire_fails),
 222
 223    cmocka_unit_test(test_update_inventory_success),
 224
 225    cmocka_unit_test(test_get_low_stock_success),
 226  };
 1227  return cmocka_run_group_tests(tests, NULL, NULL);
 228}

Methods/Properties