/* Copyright © 2023 Thomas von Dein 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 3 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. If not, see . */ package api import ( //"github.com/alecthomas/repr" "github.com/maxatome/go-testdeep/td" "github.com/tlinden/ephemerup/cfg" "github.com/tlinden/ephemerup/common" "os" "testing" "time" ) func finalize(db *Db) { if db.bolt != nil { db.Close() } if _, err := os.Stat(db.cfg.DbFile); err == nil { os.Remove(db.cfg.DbFile) } } func TestNew(t *testing.T) { var tests = []struct { name string dbfile string wantfail bool }{ {"opennew", "test.db", false}, {"openfail", "/hopefully/not/existing/directory/test.db", true}, } for _, tt := range tests { c := &cfg.Config{DbFile: tt.dbfile} t.Run(tt.name, func(t *testing.T) { db, err := NewDb(c) defer finalize(db) if err != nil && !tt.wantfail { t.Errorf("expected: &Db{}, got err: " + err.Error()) } if err == nil && tt.wantfail { t.Errorf("expected: fail, got &Db{}") } }) } } const timeformat string = "2006-01-02T15:04:05.000Z" var dbtests = []struct { name string dbfile string wantfail bool id string context string ts string filter string upload common.Upload form common.Form }{ { "upload", "test.db", false, "1", "foo", "2023-03-10T11:45:00.000Z", "", common.Upload{ Id: "1", Expire: "asap", File: "none", Context: "foo", Created: common.Timestamp{}}, common.Form{}, }, { "form", "test.db", false, "2", "foo", "2023-03-10T11:45:00.000Z", "", common.Upload{}, common.Form{ Id: "1", Expire: "asap", Description: "none", Context: "foo", Created: common.Timestamp{}}, }, } /* We need to test the whole Db operation in one run, because it doesn't work well if using a global Db. */ func TestDboperation(t *testing.T) { for _, tt := range dbtests { c := &cfg.Config{DbFile: tt.dbfile} t.Run(tt.name, func(t *testing.T) { // create new bbolt db db, err := NewDb(c) defer finalize(db) if err != nil { t.Errorf("Could not open new DB: " + err.Error()) } if tt.upload.Id != "" { // set ts ts, err := time.Parse(timeformat, tt.ts) tt.upload.Created = common.Timestamp{Time: ts} // create new upload db object err = db.Insert(tt.id, tt.upload) if err != nil { t.Errorf("Could not insert new upload object: " + err.Error()) } // fetch it response, err := db.Get(tt.context, tt.id, common.TypeUpload) if err != nil { t.Errorf("Could not fetch upload object: " + err.Error()) } // is it there? if len(response.Uploads) != 1 { t.Errorf("db.Get() did not return an upload obj") } // compare times if !tt.upload.Created.Time.Equal(response.Uploads[0].Created.Time) { t.Errorf("Timestamps don't match!\ngot: %s\nexp: %s\n", response.Uploads[0].Created, tt.upload.Created) } // equal them artificially, because otherwise td will // fail because of time.Time.wall+ext, or TZ is missing response.Uploads[0].Created = tt.upload.Created // compare td.Cmp(t, response.Uploads[0], &tt.upload, tt.name) // fetch list response, err = db.List(tt.context, tt.filter, common.TypeUpload) if err != nil { t.Errorf("Could not fetch uploads list: " + err.Error()) } // is it there? if len(response.Uploads) != 1 { t.Errorf("db.List() did not return upload obj[s]") } // delete err = db.Delete(tt.context, tt.id) if err != nil { t.Errorf("Could not delete upload obj: " + err.Error()) } // fetch again, shall return empty response, err = db.Get(tt.context, tt.id, common.TypeUpload) if err == nil { t.Errorf("Could fetch upload object again although we deleted it") } } if tt.form.Id != "" { // set ts ts, err := time.Parse(timeformat, tt.ts) tt.form.Created = common.Timestamp{Time: ts} // create new form db object err = db.Insert(tt.id, tt.form) if err != nil { t.Errorf("Could not insert new form object: " + err.Error()) } // fetch it response, err := db.Get(tt.context, tt.id, common.TypeForm) if err != nil { t.Errorf("Could not fetch form object: " + err.Error()) } // is it there? if len(response.Forms) != 1 { t.Errorf("db.Get() did not return an form obj") } // compare times if !tt.form.Created.Time.Equal(response.Forms[0].Created.Time) { t.Errorf("Timestamps don't match!\ngot: %s\nexp: %s\n", response.Forms[0].Created, tt.form.Created) } // equal them artificially, because otherwise td will // fail because of time.Time.wall+ext, or TZ is missing response.Forms[0].Created = tt.form.Created // compare td.Cmp(t, response.Forms[0], &tt.form, tt.name) // fetch list response, err = db.List(tt.context, tt.filter, common.TypeForm) if err != nil { t.Errorf("Could not fetch forms list: " + err.Error()) } // is it there? if len(response.Forms) != 1 { t.Errorf("db.FormsList() did not return form obj[s]") } // delete err = db.Delete(tt.context, tt.id) if err != nil { t.Errorf("Could not delete form obj: " + err.Error()) } // fetch again, shall return empty response, err = db.Get(tt.context, tt.id, common.TypeForm) if err == nil { t.Errorf("Could fetch form object again although we deleted it") } } }) } }