< Summary - Backend C Tests - Coverage Report

Information
Class: test_alert_service_real_c
Assembly: src.backend.tests.unit.database
File(s): C:\Users\yagiz\Desktop\Project\smart-maintenance-suite\src\backend\tests\unit\database\test_alert_service_real.c
Line coverage
95%
Covered lines: 62
Uncovered lines: 3
Coverable lines: 65
Total lines: 134
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

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
LOG_INFO100%000%
LOG_ERROR100%000%
db_pool_acquire100%00100%
db_pool_release100%00100%
PQexec100%00100%
PQresultStatus100%00100%
PQclear100%00100%
PQntuples100%00100%
PQgetvalue90%0085.71%
PQerrorMessage100%00100%
test_create_alert_paths100%00100%
test_check_and_trigger_logic100%00100%
test_get_recent_alerts_paths100%00100%
test_serialize_alerts100%00100%
main100%00100%

File(s)

C:\Users\yagiz\Desktop\Project\smart-maintenance-suite\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, ...) {}
 22
 023void LOG_ERROR(const char *format, ...) {}
 24
 25// Mock State
 26static DBConnection mock_conn;
 27static int mock_acquire_success = 1;
 28static int mock_result_status = PGRES_TUPLES_OK;
 29static int mock_ntuples = 1;
 30
 31// Mock DB functions
 1032DBConnection *db_pool_acquire(void) {
 1033  if (mock_acquire_success) {
 834    mock_conn.pg_conn = (void *)0x1234;
 835    return &mock_conn;
 36  }
 37
 238  return NULL;
 39}
 40
 841void db_pool_release(DBConnection *conn) {}
 42
 843void *PQexec(void *conn, const char *query) {
 844  return (void *)0x5678;
 45}
 46
 847int PQresultStatus(const void *res) {
 848  return mock_result_status;
 49}
 50
 851void PQclear(void *res) {}
 52
 253int PQntuples(const void *res) {
 254  return mock_ntuples;
 55}
 56
 1557char *PQgetvalue(const void *res, int row, int field) {
 1558  if (field == 0) return "100"; // ID
 59
 1260  if (field == 1) return "1"; // SensorID
 61
 962  if (field == 2) return "CRITICAL";
 63
 664  if (field == 3) return "Mock Message";
 65
 366  if (field == 4) return "2026-02-18 22:40:00";
 67
 068  return "";
 69}
 70
 171char *PQerrorMessage(const void *conn) {
 172  return "Alert Mock Error";
 73}
 74
 75/* ====================================================================
 76 * TEST CASES
 77 * ==================================================================== */
 78
 179static void test_create_alert_paths(void **state) {
 180  mock_acquire_success = 1;
 181  mock_result_status = PGRES_COMMAND_OK;
 182  assert_true(create_alert(1, SEVERITY_WARNING, "Test Message"));
 183  mock_result_status = PGRES_FATAL_ERROR;
 184  assert_false(create_alert(1, SEVERITY_WARNING, "Test Message"));
 185  mock_acquire_success = 0;
 186  assert_false(create_alert(1, SEVERITY_WARNING, "Test Message"));
 187}
 88
 189static void test_check_and_trigger_logic(void **state) {
 190  mock_acquire_success = 1;
 191  mock_result_status = PGRES_COMMAND_OK;
 92  // Temperature paths
 193  check_and_trigger_alerts(1, "Temperature", 95.0); // Critical
 194  check_and_trigger_alerts(1, "Temperature", 80.0); // Warning
 195  check_and_trigger_alerts(1, "Temperature", 50.0); // None
 96  // Vibration
 197  check_and_trigger_alerts(2, "Vibration", 6.0); // Critical
 198  check_and_trigger_alerts(2, "Vibration", 1.0); // None
 99  // Pressure
 1100  check_and_trigger_alerts(3, "Pressure", 15.0); // Warning
 1101  check_and_trigger_alerts(3, "Pressure", 5.0); // None
 102  // Unknown
 1103  check_and_trigger_alerts(4, "Unknown", 100.0);
 1104}
 105
 1106static void test_get_recent_alerts_paths(void **state) {
 1107  mock_acquire_success = 1;
 1108  mock_result_status = PGRES_TUPLES_OK;
 1109  mock_ntuples = 2;
 110  AlertInfo arr[10];
 1111  assert_int_equal(get_recent_alerts(arr, 10), 2);
 1112  mock_acquire_success = 0;
 1113  assert_int_equal(get_recent_alerts(arr, 10), 0);
 1114}
 115
 1116static void test_serialize_alerts(void **state) {
 1117  mock_acquire_success = 1;
 1118  mock_result_status = PGRES_TUPLES_OK;
 1119  mock_ntuples = 1;
 1120  char *json = alert_service_serialize_alerts();
 1121  assert_non_null(json);
 1122  assert_true(strstr(json, "CRITICAL") != NULL);
 1123  free(json);
 1124}
 125
 1126int main(void) {
 1127  const struct CMUnitTest tests[] = {
 128    cmocka_unit_test(test_create_alert_paths),
 129    cmocka_unit_test(test_check_and_trigger_logic),
 130    cmocka_unit_test(test_get_recent_alerts_paths),
 131    cmocka_unit_test(test_serialize_alerts),
 132  };
 1133  return cmocka_run_group_tests(tests, NULL, NULL);
 134}