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

Information
Class: test_maintenance_service_real_c
Assembly: src.backend.tests.unit.database
File(s): ./src/backend/tests/unit/database/test_maintenance_service_real.c
Line coverage
96%
Covered lines: 86
Uncovered lines: 3
Coverable lines: 89
Total lines: 163
Line coverage: 96.6%
Branch coverage
92%
Covered branches: 13
Total branches: 14
Branch coverage: 92.8%
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: 96.6% (86/89) Branch coverage: 92.8% (13/14) Total lines: 163 2/18/2026 - 10:50:55 PM Line coverage: 96.6% (86/89) Branch coverage: 92.8% (13/14) Total lines: 163

File(s)

./src/backend/tests/unit/database/test_maintenance_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// PostgreSQL Definitions (to avoid libpq-fe.h)
 10#define LIBPQ_FE_H
 11#define PGconn void
 12#define PGresult void
 13#define PGRES_COMMAND_OK 1
 14#define PGRES_TUPLES_OK 2
 15#define PGRES_FATAL_ERROR 3
 16
 17#include "maintenance_service.h"
 18#include "db_connection.h"
 19
 20// Logger mock
 021void LOG_INFO(const char *format, ...) {}
 022void LOG_ERROR(const char *format, ...) {}
 23
 24// Mock State
 25static DBConnection mock_conn;
 26static int mock_acquire_success = 1;
 27static int mock_result_status = PGRES_COMMAND_OK;
 28static int mock_ntuples = 0;
 29
 30// Mock DB functions
 1331DBConnection *db_pool_acquire(void) {
 1332    if (mock_acquire_success) {
 833        mock_conn.pg_conn = (void *)0x1234;
 834        return &mock_conn;
 35    }
 536    return NULL;
 37}
 38
 839void db_pool_release(DBConnection *conn) {}
 40
 841void *PQexec(void *conn, const char *query) {
 842    return (void *)0x5678;
 43}
 44
 845int PQresultStatus(const void *res) {
 846    return mock_result_status;
 47}
 48
 849void PQclear(void *res) {}
 50
 251int PQntuples(const void *res) {
 252    return mock_ntuples;
 53}
 54
 1855char *PQgetvalue(const void *res, int row, int field) {
 1856    if (field == 0) return "1"; // ID
 1557    if (field == 1) return "10"; // MachineID
 1258    if (field == 2) return "TestTech";
 959    if (field == 3) return "2026-02-18";
 660    if (field == 4) return "Test Description";
 361    if (field == 5) return "150.50"; // Cost
 062    return "";
 63}
 64
 365char *PQerrorMessage(const void *conn) {
 366    return "Mock Error Material";
 67}
 68
 69/* ====================================================================
 70 * TEST CASES
 71 * ==================================================================== */
 72
 173static void test_add_maintenance_log_success(void **state) {
 174    mock_acquire_success = 1;
 175    mock_result_status = PGRES_COMMAND_OK;
 176    bool result = add_maintenance_log(1, "Tech1", "Maintenance", 100.0);
 177    assert_true(result);
 178}
 79
 180static void test_add_maintenance_log_fail(void **state) {
 181    mock_acquire_success = 0;
 182    bool result = add_maintenance_log(1, "Tech1", "Maintenance", 100.0);
 183    assert_false(result);
 84
 85    // DB error
 186    mock_acquire_success = 1;
 187    mock_result_status = PGRES_FATAL_ERROR;
 188    result = add_maintenance_log(1, "Tech1", "Maintenance", 100.0);
 189    assert_false(result);
 190}
 91
 192static void test_get_maintenance_history_paths(void **state) {
 93    // Success
 194    mock_acquire_success = 1;
 195    mock_result_status = PGRES_TUPLES_OK;
 196    mock_ntuples = 2;
 97    MaintenanceLog logs[5];
 198    int count = get_maintenance_history(1, logs, 5);
 199    assert_int_equal(count, 2);
 1100    assert_string_equal(logs[0].technician_name, "TestTech");
 101
 102    // Acquire Fail
 1103    mock_acquire_success = 0;
 1104    count = get_maintenance_history(1, logs, 5);
 1105    assert_int_equal(count, 0);
 106
 107    // Query Fail
 1108    mock_acquire_success = 1;
 1109    mock_result_status = PGRES_FATAL_ERROR;
 1110    count = get_maintenance_history(1, logs, 5);
 1111    assert_int_equal(count, 0);
 1112}
 113
 1114static void test_get_all_maintenance_logs_paths(void **state) {
 1115    mock_acquire_success = 1;
 1116    mock_result_status = PGRES_TUPLES_OK;
 1117    mock_ntuples = 1;
 118    MaintenanceLog items[10];
 1119    int count = get_all_maintenance_logs(items, 10);
 1120    assert_int_equal(count, 1);
 121
 1122    mock_acquire_success = 0;
 1123    count = get_all_maintenance_logs(items, 10);
 1124    assert_int_equal(count, 0);
 1125}
 126
 1127static void test_update_maintenance_log_paths(void **state) {
 1128    mock_acquire_success = 1;
 1129    mock_result_status = PGRES_COMMAND_OK;
 1130    bool res = update_maintenance_log(1, "Updated", 200.0);
 1131    assert_true(res);
 132
 1133    mock_result_status = PGRES_FATAL_ERROR;
 1134    res = update_maintenance_log(1, "Updated", 200.0);
 1135    assert_false(res);
 136
 1137    mock_acquire_success = 0;
 1138    res = update_maintenance_log(1, "Updated", 200.0);
 1139    assert_false(res);
 1140}
 141
 1142static void test_delete_maintenance_log_paths(void **state) {
 1143    mock_acquire_success = 1;
 1144    mock_result_status = PGRES_COMMAND_OK;
 1145    bool res = delete_maintenance_log(1);
 1146    assert_true(res);
 147
 1148    mock_acquire_success = 0;
 1149    res = delete_maintenance_log(1);
 1150    assert_false(res);
 1151}
 152
 1153int main(void) {
 1154    const struct CMUnitTest tests[] = {
 155        cmocka_unit_test(test_add_maintenance_log_success),
 156        cmocka_unit_test(test_add_maintenance_log_fail),
 157        cmocka_unit_test(test_get_maintenance_history_paths),
 158        cmocka_unit_test(test_get_all_maintenance_logs_paths),
 159        cmocka_unit_test(test_update_maintenance_log_paths),
 160        cmocka_unit_test(test_delete_maintenance_log_paths),
 161    };
 1162    return cmocka_run_group_tests(tests, NULL, NULL);
 163}

Methods/Properties