From 2d221a6b67c39c0f96f2f864e9edc5f91fed3616 Mon Sep 17 00:00:00 2001
From: Ralph Slooten <axllent@gmail.com>
Date: Fri, 5 Aug 2022 21:35:57 +1200
Subject: [PATCH] Testing: Memory & physical database tests

---
 storage/database_test.go | 59 ++++++++++++++++++++++++++++++++++------
 1 file changed, 51 insertions(+), 8 deletions(-)

diff --git a/storage/database_test.go b/storage/database_test.go
index c2152ff..5f58e43 100644
--- a/storage/database_test.go
+++ b/storage/database_test.go
@@ -5,6 +5,8 @@ import (
 	"fmt"
 	"io/ioutil"
 	"math/rand"
+	"os"
+	"path"
 	"testing"
 	"time"
 
@@ -18,8 +20,10 @@ var (
 )
 
 func TestTextEmailInserts(t *testing.T) {
-	setup()
+	setup(false)
+	t.Log("Testing memory storage")
 
+RepeatTest:
 	start := time.Now()
 	for i := 0; i < 1000; i++ {
 		if _, err := Store(DefaultMailbox, testTextEmail); err != nil {
@@ -55,11 +59,20 @@ func TestTextEmailInserts(t *testing.T) {
 	t.Logf("deleted 1,000 text emails in %s\n", time.Since(delStart))
 
 	db.Close()
+	if config.DataDir == "" {
+		setup(true)
+		t.Logf("Testing physical storage to %s", config.DataDir)
+		defer os.RemoveAll(config.DataDir)
+		goto RepeatTest
+	}
+
 }
 
 func TestMimeEmailInserts(t *testing.T) {
-	setup()
+	setup(false)
+	t.Log("Testing memory storage")
 
+RepeatTest:
 	start := time.Now()
 	for i := 0; i < 1000; i++ {
 		if _, err := Store(DefaultMailbox, testMimeEmail); err != nil {
@@ -95,11 +108,19 @@ func TestMimeEmailInserts(t *testing.T) {
 	t.Logf("deleted 1,000 mime emails in %s\n", time.Since(delStart))
 
 	db.Close()
+	if config.DataDir == "" {
+		setup(true)
+		t.Logf("Testing physical storage to %s", config.DataDir)
+		defer os.RemoveAll(config.DataDir)
+		goto RepeatTest
+	}
 }
 
 func TestRetrieveMimeEmail(t *testing.T) {
-	setup()
+	setup(false)
+	t.Log("Testing memory storage")
 
+RepeatTest:
 	id, err := Store(DefaultMailbox, testMimeEmail)
 	if err != nil {
 		t.Log("error ", err)
@@ -128,11 +149,20 @@ func TestRetrieveMimeEmail(t *testing.T) {
 	assertEqual(t, len(inlineData.Content), msg.Inline[0].Size, "inline attachment size does not match")
 
 	db.Close()
+
+	if config.DataDir == "" {
+		setup(true)
+		t.Logf("Testing physical storage to %s", config.DataDir)
+		defer os.RemoveAll(config.DataDir)
+		goto RepeatTest
+	}
 }
 
 func TestSearch(t *testing.T) {
-	setup()
+	setup(false)
+	t.Log("Testing memory storage")
 
+RepeatTest:
 	for i := 0; i < 1000; i++ {
 		msg := enmime.Builder().
 			From(fmt.Sprintf("From %d", i), fmt.Sprintf("from-%d@example.com", i)).
@@ -198,10 +228,17 @@ func TestSearch(t *testing.T) {
 	assertEqual(t, len(summaries), 200, "200 search results expected")
 
 	db.Close()
+
+	if config.DataDir == "" {
+		setup(true)
+		t.Logf("Testing physical storage to %s", config.DataDir)
+		defer os.RemoveAll(config.DataDir)
+		goto RepeatTest
+	}
 }
 
 func BenchmarkImportText(b *testing.B) {
-	setup()
+	setup(false)
 
 	for i := 0; i < b.N; i++ {
 		if _, err := Store(DefaultMailbox, testTextEmail); err != nil {
@@ -214,7 +251,7 @@ func BenchmarkImportText(b *testing.B) {
 }
 
 func BenchmarkImportMime(b *testing.B) {
-	setup()
+	setup(false)
 
 	for i := 0; i < b.N; i++ {
 		if _, err := Store(DefaultMailbox, testMimeEmail); err != nil {
@@ -225,9 +262,16 @@ func BenchmarkImportMime(b *testing.B) {
 	db.Close()
 }
 
-func setup() {
+func setup(dataDir bool) {
 	config.NoLogging = true
 	config.MaxMessages = 0
+
+	if dataDir {
+		config.DataDir = fmt.Sprintf("%s-%d", path.Join(os.TempDir(), "mailpit-tests"), time.Now().UnixNano())
+	} else {
+		config.DataDir = ""
+	}
+
 	if err := InitDB(); err != nil {
 		panic(err)
 	}
@@ -243,7 +287,6 @@ func setup() {
 	if err != nil {
 		panic(err)
 	}
-
 }
 
 func assertEqual(t *testing.T, a interface{}, b interface{}, message string) {