/* * Publication Harvester * Copyright (c) 2003-2006 Stellman & Greene Consulting * Developed for Joshua Zivin and Pierre Azoulay, Columbia University * http://www.stellman-greene.com/PublicationHarvester * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this program (GPL.txt); if not, write to the Free Software Foundation, Inc., 51 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.Odbc; using NUnit.Framework; namespace Com.StellmanGreene.PubMed.Unit_Tests { /// /// Test the Person class /// Note: A lot of Person functionality is verified in TestPeople /// GetAuthorPosition is verified in TestHarvester /// [TestFixture] public class TestPerson { /// /// Write a PersonToWrite, then write him again to make sure that the existing /// row is updated /// [Test] public void WriteAPersonTwice() { string[] Names = {"a", "b", "c"}; Person PersonToWrite = new Person("1234ABCD", "First", "Middle", "Last", false, Names, "Medline search query"); Assert.IsTrue(PersonToWrite.Setnb == "1234ABCD"); Assert.IsTrue(PersonToWrite.First == "First"); Assert.IsTrue(PersonToWrite.Middle == "Middle"); Assert.IsTrue(PersonToWrite.Last == "Last"); Assert.IsTrue(PersonToWrite.Harvested == false); Assert.IsTrue(PersonToWrite.Names.Length == 3); Assert.IsTrue(PersonToWrite.Names[0] == "a"); Assert.IsTrue(PersonToWrite.Names[1] == "b"); Assert.IsTrue(PersonToWrite.Names[2] == "c"); Assert.IsTrue(PersonToWrite.MedlineSearch == "Medline search query"); // Write the person to the database Database DB = new Database("Publication Harvester Unit Test"); Harvester harvester = new Harvester(DB); harvester.CreateTables(); PersonToWrite.WriteToDB(DB); // Read the person back from the database DataTable PeopleFileData = new DataTable(); PeopleFileData = DB.ExecuteQuery("SELECT " + Database.PEOPLE_COLUMNS + " FROM People WHERE Setnb = '1234ABCD'"); Assert.IsTrue(PeopleFileData.Rows.Count == 1); Person PersonToRead = new Person(PeopleFileData.Rows[0], PeopleFileData.Columns); Assert.IsTrue(PersonToRead.Setnb == "1234ABCD"); Assert.IsTrue(PersonToRead.First == "First"); Assert.IsTrue(PersonToRead.Middle == "Middle"); Assert.IsTrue(PersonToRead.Last == "Last"); Assert.IsTrue(PersonToRead.Harvested == false); Assert.IsTrue(PersonToRead.Names.Length == 3); Assert.IsTrue(PersonToRead.Names[0] == "a"); Assert.IsTrue(PersonToRead.Names[1] == "b"); Assert.IsTrue(PersonToRead.Names[2] == "c"); Assert.IsTrue(PersonToRead.MedlineSearch == "Medline search query"); // Update the database, read him back again, and make sure there's still // one row in People PersonToRead.First = "NewFirst"; PersonToRead.Middle = "NewMiddle"; PersonToRead.Last = "NewLast"; PersonToRead.Names = new string[] {"d", "e", "f", "g"}; PersonToRead.MedlineSearch = "new query"; PersonToRead.Harvested = true; PersonToRead.WriteToDB(DB); DataTable Results = DB.ExecuteQuery("SELECT " + Database.PEOPLE_COLUMNS + " FROM People WHERE Setnb = '1234ABCD'"); Assert.IsTrue(Results.Rows.Count == 1); Assert.IsTrue(Results.Rows[0]["Setnb"].ToString() == "1234ABCD"); Assert.IsTrue(Results.Rows[0]["First"].ToString() == "NewFirst"); Assert.IsTrue(Results.Rows[0]["Middle"].ToString() == "NewMiddle"); Assert.IsTrue(Results.Rows[0]["Last"].ToString() == "NewLast"); Assert.IsTrue(Results.Rows[0]["Name1"].ToString() == "d"); Assert.IsTrue(Results.Rows[0]["Name2"].ToString() == "e"); Assert.IsTrue(Results.Rows[0]["Name3"].ToString() == "f"); Assert.IsTrue(Results.Rows[0]["Name4"].ToString() == "g"); Assert.IsTrue(Results.Rows[0]["MedlineSearch"].ToString() == "new query"); bool boolValue; Assert.IsTrue(Database.GetBoolValue(Results.Rows[0]["Harvested"], out boolValue)); Assert.IsTrue(boolValue); // Make sure that Name2 through Name4 are updated properly when nulls are inserted PersonToRead.Names = new string[] { "a name" }; PersonToRead.WriteToDB(DB); Results = DB.ExecuteQuery("SELECT " + Database.PEOPLE_COLUMNS + " FROM People WHERE Setnb = '1234ABCD'"); Assert.IsTrue(Results.Rows[0]["Name1"].ToString() == "a name"); Assert.IsTrue(Results.Rows[0]["Name2"].Equals(DBNull.Value)); Assert.IsTrue(Results.Rows[0]["Name3"].Equals(DBNull.Value)); Assert.IsTrue(Results.Rows[0]["Name4"].Equals(DBNull.Value)); } /// /// Write and clear an error /// [Test] public void WriteAndClearError() { string[] Names = { "a", "b", "c" }; Person PersonToWrite = new Person("1234ABCD", "First", "Middle", "Last", false, Names, "Medline search query"); // Write the person to the database Database DB = new Database("Publication Harvester Unit Test"); Harvester harvester = new Harvester(DB); harvester.CreateTables(); PersonToWrite.WriteToDB(DB); // Write an error PersonToWrite.WriteErrorToDB(DB, "This is the error message"); DataTable Results = DB.ExecuteQuery("SELECT Error, ErrorMessage FROM People WHERE Setnb = '1234ABCD'"); Assert.IsTrue(Results.Rows[0]["Error"].Equals(true)); Assert.IsTrue(Results.Rows[0]["ErrorMessage"].ToString() == "This is the error message"); // Clear the error -- note that we need to use GetBoolValue() to get around the MySQL bug PersonToWrite.ClearErrorInDB(DB); Results = DB.ExecuteQuery("SELECT " + Database.PEOPLE_COLUMNS + " FROM People WHERE Setnb = '1234ABCD'"); bool boolValue; Assert.IsTrue(Database.GetBoolValue(Results.Rows[0]["Error"], out boolValue)); Assert.IsTrue(boolValue == false); Assert.IsTrue(Results.Rows[0]["ErrorMessage"].ToString() == ""); } /// /// Verify that long hyphenated names read properly from the name* /// columns in the People file, and that they are written properly /// to the database. /// [Test] public void TestHyphens() { // Retrieve the publications for each person in input1.xls using GetPublications() People PeopleFromFile = new People( AppDomain.CurrentDomain.BaseDirectory + "\\Unit Tests\\TestPeople", "test hyphens.xls"); Assert.IsTrue(PeopleFromFile.PersonList.Count == 1); Person PersonToWrite = PeopleFromFile.PersonList[0]; Assert.IsTrue(PersonToWrite.Names.Length == 3); Assert.IsTrue(PersonToWrite.Names[0] == "wassertheil-smoller s"); Assert.IsTrue(PersonToWrite.Names[1] == "wassertheil s"); Assert.IsTrue(PersonToWrite.Names[2] == "wassertheil-smoller sm"); // Write them to the database and read them back Database DB = new Database("Publication Harvester Unit Test"); Harvester harvester = new Harvester(DB); harvester.CreateTables(); PersonToWrite.WriteToDB(DB); People PeopleFromDB = new People(DB); Assert.IsTrue(PeopleFromDB.PersonList.Count == 1); Person PersonToRead = PeopleFromDB.PersonList[0]; Assert.IsTrue(PersonToRead.Names.Length == 3); Assert.IsTrue(PersonToRead.Names[0] == "wassertheil-smoller s"); Assert.IsTrue(PersonToRead.Names[1] == "wassertheil s"); Assert.IsTrue(PersonToRead.Names[2] == "wassertheil-smoller sm"); } } }