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

Information
Class: test_alert_service_real_c
Assembly: src.backend.tests.unit.database
File(s): ./src/backend/tests/unit/database/test_alert_service_real.c
Line coverage
95%
Covered lines: 62
Uncovered lines: 3
Coverable lines: 65
Total lines: 136
Line coverage: 95.3%
Branch coverage
91%
Covered branches: 11
Total branches: 12
Branch coverage: 91.6%
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: 95.3% (62/65) Branch coverage: 91.6% (11/12) Total lines: 136 2/18/2026 - 10:50:55 PM Line coverage: 95.3% (62/65) Branch coverage: 91.6% (11/12) Total lines: 136

File(s)

./src/backend/tests/unit/database/test_alert_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
 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 "alert_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_TUPLES_OK;
 28static int mock_ntuples = 1;
 29
 30// Mock DB functions
 1031DBConnection *db_pool_acquire(void) {
 1032    if (mock_acquire_success) {
 833        mock_conn.pg_conn = (void *)0x1234;
 834        return &mock_conn;
 35    }
 236    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
 1555char *PQgetvalue(const void *res, int row, int field) {
 1556    if (field == 0) return "100"; // ID
 1257    if (field == 1) return "1"; // SensorID
 958    if (field == 2) return "CRITICAL";
 659    if (field == 3) return "Mock Message";
 360    if (field == 4) return "2026-02-18 22:40:00";
 061    return "";
 62}
 63
 164char *PQerrorMessage(const void *conn) {
 165    return "Alert Mock Error";
 66}
 67
 68/* ====================================================================
 69 * TEST CASES
 70 * ==================================================================== */
 71
 172static void test_create_alert_paths(void **state) {
 173    mock_acquire_success = 1;
 174    mock_result_status = PGRES_COMMAND_OK;
 175    assert_true(create_alert(1, SEVERITY_WARNING, "Test Message"));
 76
 177    mock_result_status = PGRES_FATAL_ERROR;
 178    assert_false(create_alert(1, SEVERITY_WARNING, "Test Message"));
 79
 180    mock_acquire_success = 0;
 181    assert_false(create_alert(1, SEVERITY_WARNING, "Test Message"));
 182}
 83
 184static void test_check_and_trigger_logic(void **state) {
 185    mock_acquire_success = 1;
 186    mock_result_status = PGRES_COMMAND_OK;
 87
 88    // Temperature paths
 189    check_and_trigger_alerts(1, "Temperature", 95.0); // Critical
 190    check_and_trigger_alerts(1, "Temperature", 80.0); // Warning
 191    check_and_trigger_alerts(1, "Temperature", 50.0); // None
 92
 93    // Vibration
 194    check_and_trigger_alerts(2, "Vibration", 6.0); // Critical
 195    check_and_trigger_alerts(2, "Vibration", 1.0); // None
 96
 97    // Pressure
 198    check_and_trigger_alerts(3, "Pressure", 15.0); // Warning
 199    check_and_trigger_alerts(3, "Pressure", 5.0); // None
 100
 101    // Unknown
 1102    check_and_trigger_alerts(4, "Unknown", 100.0);
 1103}
 104
 1105static void test_get_recent_alerts_paths(void **state) {
 1106    mock_acquire_success = 1;
 1107    mock_result_status = PGRES_TUPLES_OK;
 1108    mock_ntuples = 2;
 109
 110    AlertInfo arr[10];
 1111    assert_int_equal(get_recent_alerts(arr, 10), 2);
 112
 1113    mock_acquire_success = 0;
 1114    assert_int_equal(get_recent_alerts(arr, 10), 0);
 1115}
 116
 1117static void test_serialize_alerts(void **state) {
 1118    mock_acquire_success = 1;
 1119    mock_result_status = PGRES_TUPLES_OK;
 1120    mock_ntuples = 1;
 121
 1122    char *json = alert_service_serialize_alerts();
 1123    assert_non_null(json);
 1124    assert_true(strstr(json, "CRITICAL") != NULL);
 1125    free(json);
 1126}
 127
 1128int main(void) {
 1129    const struct CMUnitTest tests[] = {
 130        cmocka_unit_test(test_create_alert_paths),
 131        cmocka_unit_test(test_check_and_trigger_logic),
 132        cmocka_unit_test(test_get_recent_alerts_paths),
 133        cmocka_unit_test(test_serialize_alerts),
 134    };
 1135    return cmocka_run_group_tests(tests, NULL, NULL);
 136}

Methods/Properties