aboutsummaryrefslogtreecommitdiffstats
path: root/datamaps/db_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'datamaps/db_test.go')
-rw-r--r--datamaps/db_test.go235
1 files changed, 235 insertions, 0 deletions
diff --git a/datamaps/db_test.go b/datamaps/db_test.go
new file mode 100644
index 0000000..87801a0
--- /dev/null
+++ b/datamaps/db_test.go
@@ -0,0 +1,235 @@
+package datamaps
+
+import (
+ "database/sql"
+ "fmt"
+ "os"
+ "os/exec"
+ "strings"
+ "testing"
+)
+
+var singleTarget string = "./testdata/test_template.xlsm"
+
+var opts = Options{
+ DBPath: "./testdata/test.db",
+ DMName: "First Datamap",
+ DMPath: "./testdata/datamap_matches_test_template.csv",
+ XLSXPath: "./testdata/",
+}
+
+func dbSetup() (*sql.DB, error) {
+ db, err := setupDB("./testdata/test.db")
+ if err != nil {
+ return nil, err
+ }
+ return db, nil
+}
+
+func dbTeardown(db *sql.DB) {
+ db.Close()
+ os.Remove("./testdata/test.db")
+}
+
+func TestOpenSQLiteFile(t *testing.T) {
+
+ db, err := dbSetup()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer dbTeardown(db)
+
+ stmt := `insert into datamap(id, name) values(1,'cock')`
+ _, err = db.Exec(stmt)
+
+ if err != nil {
+ t.Errorf("Cannot add record to db")
+ }
+
+ rows, err := db.Query("select name from datamap")
+
+ if err != nil {
+ t.Errorf("Cannot run select statement")
+ }
+
+ defer rows.Close()
+
+ for rows.Next() {
+ var name string
+ err = rows.Scan(&name)
+ if err != nil {
+ t.Errorf("Cannot scan resulting row")
+ }
+ }
+}
+
+func TestDatamapGoesIntoDB(t *testing.T) {
+ db, err := dbSetup()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer dbTeardown(db)
+
+ if err := DatamapToDB(&opts); err != nil {
+ t.Errorf("unable to write datamap to database file because %v", err)
+ }
+}
+
+// TestImportSimpleTemplate uses importXLSXtoDB() to import data from a
+// populated template and then uses the sqlite3 executible to test the
+// contents of the database. This does not test datamaps functionality
+// in querying data in the database.
+func TestImportSimpleTemplate(t *testing.T) {
+
+ var tests = []struct {
+ sheet string
+ cellref string
+ value string
+ }{
+ {"Introduction", "A1", "10"},
+ {"Introduction", "C9", "Test Department"},
+ {"Introduction", "C22", "VUNT"},
+ {"Introduction", "J9", "Greedy Parrots"},
+ {"Summary", "B3", "This is a string"},
+ {"Summary", "B4", "2.2"},
+ {"Another Sheet", "N34", "23"},
+ {"Another Sheet", "DI15", "Rabbit Helga"},
+ }
+
+ db, err := dbSetup()
+ if err != nil {
+ t.Fatal(err)
+ }
+ defer dbTeardown(db)
+
+ // We need a datamap in there.
+ if err := DatamapToDB(&opts); err != nil {
+ t.Fatalf("cannot open %s", opts.DMPath)
+ }
+ if err := importXLSXtoDB(opts.DMName, "TEST RETURN", singleTarget, db); err != nil {
+ t.Fatalf("Something wrong: %v", err)
+ }
+
+ for _, test := range tests {
+ sql := fmt.Sprintf(`SELECT return_data.value FROM return_data, datamap_line
+ WHERE
+ (return_data.filename='test_template.xlsm'
+ AND datamap_line.cellref=%q
+ AND datamap_line.sheet=%q
+ AND return_data.dml_id=datamap_line.id);`, test.cellref, test.sheet)
+
+ got, err := exec.Command("sqlite3", opts.DBPath, sql).Output()
+ if err != nil {
+ t.Fatalf("something wrong %v", err)
+ }
+ got_s := strings.TrimSuffix(string(got), "\n")
+ if strings.Compare(got_s, test.value) != 0 {
+ t.Errorf("we wanted %s in test_template.xlsm but got %s", test.value, got_s)
+ }
+ }
+}
+
+// TestImportToDB uses ImportToDB() to import data from a
+// directory of populated templates and then uses the sqlite3 executible to test the
+// contents of the database. This does not test datamaps functionality
+// in querying data in the database.
+func TestImportToDB(t *testing.T) {
+ var tests = []struct {
+ filename string
+ sheet string
+ cellref string
+ value string
+ }{
+ {"test_template.xlsm", "Introduction", "A1", "10"},
+ {"test_template.xlsm", "Introduction", "C9", "Test Department"},
+ {"test_template.xlsm", "Introduction", "C22", "VUNT"},
+ {"test_template.xlsm", "Introduction", "J9", "Greedy Parrots"},
+ {"test_template.xlsm", "Summary", "B3", "This is a string"},
+ {"test_template.xlsm", "Summary", "B4", "2.2"},
+ {"test_template.xlsm", "Another Sheet", "N34", "23"},
+ {"test_template.xlsm", "Another Sheet", "DI15", "Rabbit Helga"},
+
+ {"test_template.xlsx", "Introduction", "A1", "10"},
+ {"test_template.xlsx", "Introduction", "C9", "Test Department"},
+ {"test_template.xlsx", "Introduction", "C22", "VUNT"},
+ {"test_template.xlsx", "Introduction", "J9", "Greedy Parrots"},
+ {"test_template.xlsx", "Summary", "B3", "This is a string"},
+ {"test_template.xlsx", "Summary", "B4", "2.2"},
+ {"test_template.xlsx", "Another Sheet", "N34", "23"},
+ {"test_template.xlsx", "Another Sheet", "DI15", "Rabbit Helga"},
+
+ {"test_template2.xlsx", "Introduction", "A1", "10"},
+ {"test_template2.xlsx", "Introduction", "C9", "Test Department"},
+ {"test_template2.xlsx", "Introduction", "C22", "VUNT"},
+ {"test_template2.xlsx", "Introduction", "J9", "Greedy Parrots"},
+ {"test_template2.xlsx", "Summary", "B3", "This is a string"},
+ {"test_template2.xlsx", "Summary", "B4", "2.2"},
+ {"test_template2.xlsx", "Another Sheet", "N34", "23"},
+ {"test_template2.xlsx", "Another Sheet", "DI15", "Rabbit Helga"},
+
+ {"test_template3.xlsx", "Introduction", "A1", "10"},
+ {"test_template3.xlsx", "Introduction", "C9", "Test Department"},
+ {"test_template3.xlsx", "Introduction", "C22", "VUNT"},
+ {"test_template3.xlsx", "Introduction", "J9", "Greedy Parrots"},
+ {"test_template3.xlsx", "Summary", "B3", "This is a string"},
+ {"test_template3.xlsx", "Summary", "B4", "2.2"},
+ {"test_template3.xlsx", "Another Sheet", "N34", "23"},
+ {"test_template3.xlsx", "Another Sheet", "DI15",
+ "Printers run amok in the land of carnivores when bacchus rings 1009.ff faiioif !!!]=-=-1290909"},
+ }
+
+ db, err := dbSetup()
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // We need a datamap in there.
+ if err := DatamapToDB(&opts); err != nil {
+ t.Fatalf("cannot open %s", opts.DMPath)
+ }
+ defer dbTeardown(db)
+
+ if err := ImportToDB(&opts); err != nil {
+ t.Fatal(err)
+ }
+
+ for _, test := range tests {
+ sql := fmt.Sprintf(`SELECT return_data.value FROM return_data, datamap_line
+ WHERE
+ (return_data.filename=%q
+ AND datamap_line.cellref=%q
+ AND datamap_line.sheet=%q
+ AND return_data.dml_id=datamap_line.id);`, test.filename, test.cellref, test.sheet)
+
+ got, err := exec.Command("sqlite3", opts.DBPath, sql).Output()
+ if err != nil {
+ t.Fatalf("something wrong %v", err)
+ }
+ got_s := strings.TrimSuffix(string(got), "\n")
+ if strings.Compare(got_s, test.value) != 0 {
+ t.Errorf("we wanted value %q in file %s sheet %s %s but got %s",
+ test.value, test.filename, test.sheet, test.cellref, got_s)
+ }
+ }
+}
+
+// TODO:
+
+// USING THE INDEX TO tests STRUCT WE COULD DO ALL THESE IN TEST ABOVE
+
+// Returns useful error messages when querying for stuff not in datamap
+// func TestImportSimpleQueryValueNotInDatamap(t *testing.T) {
+// var tests = []struct {
+// sheet string
+// cellref string
+// value string
+// }{
+// {"Summary", "B2", "20/10/19"}, // this is not referenced in datamap
+// }
+// }
+
+// TODO:
+// When a date is returned from the spreadsheet it is an integer and needs
+// to be handled appropriately.
+// func TestValuesReturnedAsDates(t *testing.T) {
+// }