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

Information
Class: maintenance_service_c
Assembly: src.backend.database
File(s): ./src/backend/database/maintenance_service.c
Line coverage
95%
Covered lines: 88
Uncovered lines: 4
Coverable lines: 92
Total lines: 223
Line coverage: 95.6%
Branch coverage
91%
Covered branches: 22
Total branches: 24
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.6% (88/92) Branch coverage: 91.6% (22/24) Total lines: 223 2/18/2026 - 10:50:55 PM Line coverage: 95.6% (88/92) Branch coverage: 91.6% (22/24) Total lines: 223

File(s)

./src/backend/database/maintenance_service.c

#LineLine coverage
 1#include "maintenance_service.h"
 2#include "db_connection.h"
 3#include "logger.h"
 4#include <stdio.h>
 5#include <stdlib.h>
 6#include <string.h>
 7
 8#ifndef TEST_MODE
 9
 310bool add_maintenance_log(int machine_id, const char *technician, const char *description, double cost) {
 311  DBConnection *conn_wrapper = db_pool_acquire();
 12
 313  if (!conn_wrapper) {
 114    LOG_ERROR("Could not acquire connection to add maintenance log.");
 115    return false;
 16  }
 17
 18  char query[1024];
 219  snprintf(query, sizeof(query),
 20           "INSERT INTO maintenance_logs (machine_id, performer, description, cost) "
 21           "VALUES (%d, '%s', '%s', %.2f);",
 22           machine_id, technician, description, cost);
 223  PGresult *res = PQexec(conn_wrapper->pg_conn, query);
 24
 225  if (PQresultStatus(res) != PGRES_COMMAND_OK) {
 126    LOG_ERROR("Failed to insert maintenance log: %s", PQerrorMessage(conn_wrapper->pg_conn));
 127    PQclear(res);
 128    db_pool_release(conn_wrapper);
 129    return false;
 30  }
 31
 132  PQclear(res);
 133  db_pool_release(conn_wrapper);
 134  LOG_INFO("Maintenance log added for Machine %d.", machine_id);
 135  return true;
 36}
 37
 338int get_maintenance_history(int machine_id, MaintenanceLog *out_logs, int max_logs) {
 339  DBConnection *conn_wrapper = db_pool_acquire();
 40
 341  if (!conn_wrapper) {
 142    LOG_ERROR("Could not acquire connection to fetch maintenance history.");
 143    return 0;
 44  }
 45
 46  char query[256];
 247  snprintf(query, sizeof(query),
 48           "SELECT id, machine_id, performer, to_char(ts, 'YYYY-MM-DD'), description, cost "
 49           "FROM maintenance_logs WHERE machine_id = %d ORDER BY ts DESC;",
 50           machine_id);
 251  PGresult *res = PQexec(conn_wrapper->pg_conn, query);
 52
 253  if (PQresultStatus(res) != PGRES_TUPLES_OK) {
 154    LOG_ERROR("Failed to fetch maintenance history: %s", PQerrorMessage(conn_wrapper->pg_conn));
 155    PQclear(res);
 156    db_pool_release(conn_wrapper);
 157    return 0;
 58  }
 59
 160  int rows = PQntuples(res);
 161  int count = (rows < max_logs) ? rows : max_logs;
 62
 363  for (int i = 0; i < count; i++) {
 264    out_logs[i].id = atoi(PQgetvalue(res, i, 0));
 265    out_logs[i].machine_id = atoi(PQgetvalue(res, i, 1));
 266    strncpy(out_logs[i].technician_name, PQgetvalue(res, i, 2), 99);
 267    out_logs[i].technician_name[99] = '\0';
 268    strncpy(out_logs[i].log_date, PQgetvalue(res, i, 3), 31);
 269    out_logs[i].log_date[31] = '\0';
 270    strncpy(out_logs[i].description, PQgetvalue(res, i, 4), 511);
 271    out_logs[i].description[511] = '\0';
 272    out_logs[i].cost = atof(PQgetvalue(res, i, 5));
 73  }
 74
 175  PQclear(res);
 176  db_pool_release(conn_wrapper);
 177  LOG_INFO("Fetched %d maintenance logs for Machine %d.", count, machine_id);
 178  return count;
 79}
 80
 281int get_all_maintenance_logs(MaintenanceLog *out_logs, int max_logs) {
 282  DBConnection *conn_wrapper = db_pool_acquire();
 83
 284  if (!conn_wrapper) return 0;
 85
 186  const char *query = "SELECT id, machine_id, performer, to_char(ts, 'YYYY-MM-DD'), description, cost "
 87                      "FROM maintenance_logs ORDER BY ts DESC;";
 188  PGresult *res = PQexec(conn_wrapper->pg_conn, query);
 89
 190  if (PQresultStatus(res) != PGRES_TUPLES_OK) {
 091    PQclear(res);
 092    db_pool_release(conn_wrapper);
 093    return 0;
 94  }
 95
 196  int rows = PQntuples(res);
 197  int count = (rows < max_logs) ? rows : max_logs;
 98
 299  for (int i = 0; i < count; i++) {
 1100    out_logs[i].id = atoi(PQgetvalue(res, i, 0));
 1101    out_logs[i].machine_id = atoi(PQgetvalue(res, i, 1));
 1102    strncpy(out_logs[i].technician_name, PQgetvalue(res, i, 2), 99);
 1103    out_logs[i].technician_name[99] = '\0';
 1104    strncpy(out_logs[i].log_date, PQgetvalue(res, i, 3), 31);
 1105    out_logs[i].log_date[31] = '\0';
 1106    strncpy(out_logs[i].description, PQgetvalue(res, i, 4), 511);
 1107    out_logs[i].description[511] = '\0';
 1108    out_logs[i].cost = atof(PQgetvalue(res, i, 5));
 109  }
 110
 1111  PQclear(res);
 1112  db_pool_release(conn_wrapper);
 1113  return count;
 114}
 115
 3116bool update_maintenance_log(int log_id, const char *description, double cost) {
 3117  DBConnection *conn_wrapper = db_pool_acquire();
 118
 3119  if (!conn_wrapper) return false;
 120
 121  char query[1024];
 2122  snprintf(query, sizeof(query),
 123           "UPDATE maintenance_logs SET description = '%s', cost = %.2f WHERE id = %d;",
 124           description, cost, log_id);
 2125  PGresult *res = PQexec(conn_wrapper->pg_conn, query);
 2126  bool success = (PQresultStatus(res) == PGRES_COMMAND_OK);
 127
 2128  if (!success) {
 1129    LOG_ERROR("Failed to update log: %s", PQerrorMessage(conn_wrapper->pg_conn));
 130  } else {
 1131    LOG_INFO("Maintenance log %d updated successfully.", log_id);
 132  }
 133
 2134  PQclear(res);
 2135  db_pool_release(conn_wrapper);
 2136  return success;
 137}
 138
 2139bool delete_maintenance_log(int log_id) {
 2140  DBConnection *conn_wrapper = db_pool_acquire();
 141
 2142  if (!conn_wrapper) return false;
 143
 144  char query[128];
 1145  snprintf(query, sizeof(query), "DELETE FROM maintenance_logs WHERE id = %d;", log_id);
 1146  PGresult *res = PQexec(conn_wrapper->pg_conn, query);
 1147  bool success = (PQresultStatus(res) == PGRES_COMMAND_OK);
 148
 1149  if (!success) {
 0150    LOG_ERROR("Failed to delete log: %s", PQerrorMessage(conn_wrapper->pg_conn));
 151  } else {
 1152    LOG_INFO("Maintenance log %d deleted.", log_id);
 153  }
 154
 1155  PQclear(res);
 1156  db_pool_release(conn_wrapper);
 1157  return success;
 158}
 159
 160#endif  // TEST_MODE
 161
 162#ifdef TEST_MODE
 163
 164// =====================================
 165// MOCK IMPLEMENTATION
 166// =====================================
 167
 168bool add_maintenance_log(int machine_id,
 169                         const char *technician,
 170                         const char *description,
 171                         double cost) {
 172  if (machine_id <= 0 || !technician || !description)
 173    return false;
 174
 175  return true;
 176}
 177
 178int get_maintenance_history(int machine_id,
 179                            MaintenanceLog *logs,
 180                            int max_count) {
 181  if (!logs || max_count <= 0)
 182    return 0;
 183
 184  logs[0].id = 1;
 185  logs[0].machine_id = machine_id;
 186  strcpy(logs[0].technician_name, "TestTech");
 187  strcpy(logs[0].log_date, "2025-01-01");
 188  strcpy(logs[0].description, "Mock history");
 189  logs[0].cost = 100.0;
 190  return 1;
 191}
 192
 193int get_all_maintenance_logs(MaintenanceLog *logs,
 194                             int max_count) {
 195  if (!logs || max_count <= 0)
 196    return 0;
 197
 198  logs[0].id = 1;
 199  logs[0].machine_id = 1;
 200  strcpy(logs[0].technician_name, "Ali");
 201  strcpy(logs[0].log_date, "2025-01-01");
 202  strcpy(logs[0].description, "Routine oil change");
 203  logs[0].cost = 150.5;
 204  return 1;
 205}
 206
 207bool update_maintenance_log(int log_id,
 208                            const char *description,
 209                            double cost) {
 210  if (log_id <= 0 || !description)
 211    return false;
 212
 213  return true;
 214}
 215
 216bool delete_maintenance_log(int log_id) {
 217  if (log_id <= 0)
 218    return false;
 219
 220  return true;
 221}
 222
 223#endif  // TEST_MODE

Methods/Properties