github.com/ngicks/gokugen@v0.0.5/impl/repository/sqlite3_repository_test.go (about)

     1  package repository_test
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/ngicks/gokugen/impl/repository"
    11  	taskstorage "github.com/ngicks/gokugen/task_storage"
    12  )
    13  
    14  func newDbFilename() string {
    15  	p, err := os.MkdirTemp("", "sqlite3-tmp-*")
    16  	if err != nil {
    17  		panic(err)
    18  	}
    19  	return filepath.Join(p, "db")
    20  }
    21  
    22  func TestSqlite3Repo(t *testing.T) {
    23  	dbFilename := newDbFilename()
    24  
    25  	fmt.Println(dbFilename)
    26  
    27  	db, err := repository.NewSql3Repo(dbFilename)
    28  	if err != nil {
    29  		t.Fatal(err)
    30  	}
    31  	defer db.Close()
    32  
    33  	now := time.UnixMilli(time.Now().UnixMilli())
    34  	taskId, err := db.Insert(taskstorage.TaskInfo{
    35  		WorkId:        "foobarbaz",
    36  		Param:         nil,
    37  		ScheduledTime: now,
    38  	})
    39  	if err != nil {
    40  		t.Fatal(err)
    41  	}
    42  
    43  	taskInfo, err := db.GetById(taskId)
    44  
    45  	if err != nil {
    46  		t.Fatal(err)
    47  	}
    48  	if taskInfo.Id != taskId {
    49  		t.Fatalf("%s != %s", taskId, taskInfo.Id)
    50  	} else if taskInfo.Param != nil {
    51  		t.Fatalf("%v != %v", nil, taskInfo.Param)
    52  	} else if taskInfo.ScheduledTime != now {
    53  		t.Fatalf("%s != %s", now.Format(time.RFC3339Nano), taskInfo.ScheduledTime.Format(time.RFC3339Nano))
    54  	}
    55  
    56  	_, err = db.Insert(taskstorage.TaskInfo{
    57  		WorkId:        "qux",
    58  		Param:         map[string]string{"foo": "bar"},
    59  		ScheduledTime: now,
    60  	})
    61  	if err != nil {
    62  		t.Fatal(err)
    63  	}
    64  
    65  	_, err = db.Insert(taskstorage.TaskInfo{
    66  		WorkId:        "corge",
    67  		Param:         []string{"foo", "bar"},
    68  		ScheduledTime: now,
    69  	})
    70  	if err != nil {
    71  		t.Fatal(err)
    72  	}
    73  
    74  	taskInfos, err := db.GetAll()
    75  	if err != nil {
    76  		t.Fatal(err)
    77  	}
    78  	var lastUpdated time.Time
    79  	for _, v := range taskInfos {
    80  		if lastUpdated.Before(v.LastModified) {
    81  			lastUpdated = v.LastModified
    82  		}
    83  	}
    84  
    85  	time.Sleep(2 * time.Millisecond)
    86  
    87  	err = db.Update(taskId, taskstorage.UpdateDiff{
    88  		UpdateKey: taskstorage.UpdateKey{
    89  			WorkId:        true,
    90  			Param:         true,
    91  			ScheduledTime: true,
    92  			State:         true,
    93  		},
    94  		Diff: taskstorage.TaskInfo{
    95  			WorkId:        "bazbaz",
    96  			Param:         true,
    97  			ScheduledTime: lastUpdated,
    98  			State:         taskstorage.Done,
    99  		},
   100  	})
   101  	if err != nil {
   102  		t.Fatal(err)
   103  	}
   104  
   105  	taskInfos, err = db.GetUpdatedSince(lastUpdated.Add(time.Millisecond))
   106  	if err != nil {
   107  		t.Fatal(err)
   108  	}
   109  	if len(taskInfos) != 1 {
   110  		t.Fatalf("must be 1 but %d", len(taskInfos))
   111  	}
   112  	taskInfo = taskInfos[0]
   113  
   114  	if taskInfo.Id != taskId {
   115  		t.Fatalf("%s != %s", taskId, taskInfo.Id)
   116  	} else if taskInfo.Param != true {
   117  		t.Fatalf("%v != %v", true, taskInfo.Param)
   118  	} else if taskInfo.ScheduledTime != lastUpdated {
   119  		t.Fatalf("%s != %s", lastUpdated.Format(time.RFC3339Nano), taskInfo.ScheduledTime.Format(time.RFC3339Nano))
   120  	}
   121  }
   122  
   123  func TestSqlite3RepoSearchResultOrder(t *testing.T) {
   124  	var err error
   125  
   126  	db, err := repository.NewSql3Repo(newDbFilename())
   127  	if err != nil {
   128  		t.Fatal(err)
   129  	}
   130  	defer db.Close()
   131  
   132  	_, err = db.Insert(taskstorage.TaskInfo{
   133  		WorkId:        "0",
   134  		Param:         nil,
   135  		ScheduledTime: time.Now(),
   136  	})
   137  	if err != nil {
   138  		t.Fatal(err)
   139  	}
   140  	time.Sleep(time.Microsecond)
   141  	_, err = db.Insert(taskstorage.TaskInfo{
   142  		WorkId:        "1",
   143  		Param:         nil,
   144  		ScheduledTime: time.Now(),
   145  	})
   146  	if err != nil {
   147  		t.Fatal(err)
   148  	}
   149  	time.Sleep(time.Microsecond)
   150  	_, err = db.Insert(taskstorage.TaskInfo{
   151  		WorkId:        "2",
   152  		Param:         nil,
   153  		ScheduledTime: time.Now(),
   154  	})
   155  	if err != nil {
   156  		t.Fatal(err)
   157  	}
   158  
   159  	all, err := db.GetAll()
   160  	if err != nil {
   161  		t.Fatal(err)
   162  	}
   163  	if !(all[0].WorkId == "0" && all[1].WorkId == "1" && all[2].WorkId == "2") {
   164  		t.Fatalf("wrong query: %v", all)
   165  	}
   166  
   167  	updatedSince, err := db.GetUpdatedSince(all[1].LastModified)
   168  	if err != nil {
   169  		t.Fatal(err)
   170  	}
   171  	if !(updatedSince[0].WorkId == "1" && updatedSince[1].WorkId == "2") {
   172  		t.Fatalf("wrong query: %v", updatedSince)
   173  	}
   174  }