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; }