countPublishedTheses(); if ($count >= 0) { echo "✓ PASS: Found {$count} published theses\n\n"; } else { throw new Exception('Invalid count returned'); } // Test 3: Get published theses echo "Test 3: Get Published Theses\n"; $theses = $db->getPublishedTheses(5, 0); if (is_array($theses)) { echo '✓ PASS: Retrieved ' . count($theses) . " theses\n\n"; } else { throw new Exception('Invalid theses array returned'); } // Test 4: Get single thesis (if any exist) if (count($theses) > 0) { echo "Test 4: Get Single Thesis\n"; $first = $theses[0]; $thesis = $db->getThesisById($first['id']); if ($thesis && isset($thesis['id'])) { echo "✓ PASS: Successfully retrieved thesis #{$first['id']}\n"; echo ' Title: ' . $thesis['title'] . "\n"; echo ' Author(s): ' . ($thesis['authors'] ?? 'N/A') . "\n"; echo ' Year: ' . $thesis['year'] . "\n\n"; } else { throw new Exception('Failed to retrieve thesis by ID'); } } // Test 5: findOrCreateTag round-trip echo "Test 5: findOrCreateTag round-trip\n"; $testTag = '__test_tag_' . bin2hex(random_bytes(4)); $id1 = $db->findOrCreateTag($testTag); $id2 = $db->findOrCreateTag($testTag); // should return same id if ($id1 && $id1 === $id2) { echo "✓ PASS: findOrCreateTag returned consistent id=$id1 for '$testTag'\n\n"; // Clean up $db->deleteTag($id1); } else { throw new Exception("findOrCreateTag round-trip failed: id1=$id1, id2=$id2"); } // Test 6: getUsedTags returns array with 'name' column echo "Test 6: getUsedTags returns name column\n"; $tags = $db->getUsedTags(); if (is_array($tags) && (empty($tags) || isset($tags[0]['name']))) { echo '✓ PASS: getUsedTags returned ' . count($tags) . " tags with 'name' column\n\n"; } else { throw new Exception('getUsedTags did not return expected structure: ' . json_encode($tags[0] ?? [])); } echo "✅ All database tests passed!\n"; return true; } catch (Exception $e) { echo '❌ FAIL: ' . $e->getMessage() . "\n"; return false; }