eintopf.info@v0.13.16/test/integration/oqueue_indexo_search_test.go (about)

     1  // Copyright (C) 2022 The Eintopf authors
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <https://www.gnu.org/licenses/>.
    15  
    16  package integration_test
    17  
    18  import (
    19  	"context"
    20  	"os"
    21  	"testing"
    22  	"time"
    23  
    24  	"eintopf.info/service/auth"
    25  	"eintopf.info/service/dbmigration"
    26  	"eintopf.info/service/event"
    27  	"eintopf.info/service/eventsearch"
    28  	"eintopf.info/service/group"
    29  	"eintopf.info/service/oqueue"
    30  	"eintopf.info/service/place"
    31  	"eintopf.info/service/revent"
    32  	"eintopf.info/service/search"
    33  	"eintopf.info/test"
    34  )
    35  
    36  func TestIndexEventAndEventSearch(t *testing.T) {
    37  	db, cleanup, err := test.CreateSqliteTestDB(t.Name())
    38  	if err != nil {
    39  		t.Fatal(err)
    40  	}
    41  	t.Cleanup(cleanup)
    42  
    43  	queue := oqueue.NewQueue()
    44  
    45  	migrationStore, err := dbmigration.NewSqlStore(db)
    46  	if err != nil {
    47  		t.Fatal(err)
    48  	}
    49  	migrationService := dbmigration.NewService(migrationStore)
    50  
    51  	eventStore, err := event.NewSqlStore(db, migrationService)
    52  	if err != nil {
    53  		t.Fatal(err)
    54  	}
    55  	eventService := event.NewService(event.NewOperator(eventStore, queue), nil)
    56  
    57  	reventStore, err := revent.NewSqlStore(db, migrationService)
    58  	if err != nil {
    59  		t.Fatal(err)
    60  	}
    61  	reventService := revent.NewOperator(revent.NewService(reventStore, eventService), queue)
    62  
    63  	groupStore, err := group.NewSqlStore(db, migrationService)
    64  	if err != nil {
    65  		t.Fatal(err)
    66  	}
    67  	groupService := group.NewService(group.NewOperator(groupStore, queue))
    68  
    69  	placeStore, err := place.NewSqlStore(db, migrationService)
    70  	if err != nil {
    71  		t.Fatal(err)
    72  	}
    73  	placeService := place.NewService(place.NewOperator(placeStore, queue))
    74  
    75  	bleveIndex, cleanupIndex := test.CreateBleveTestIndex("TestIndexingAndSearch")
    76  	searchService, err := search.NewService(bleveIndex, time.Second, 1, 1, time.UTC)
    77  	if err != nil {
    78  		t.Fatalf("seach.NewService: %s", err)
    79  	}
    80  	t.Cleanup(cleanupIndex)
    81  	defer searchService.Stop()
    82  
    83  	eventSearchService := eventsearch.NewService(searchService, eventService, groupService, placeService, reventService)
    84  	queue.AddSubscriber(eventSearchService.ConsumeOperation, 1)
    85  
    86  	e, err := eventService.Create(
    87  		auth.ContextWithID(context.Background(), "foo"),
    88  		&event.NewEvent{Name: "test", Published: true},
    89  	)
    90  	if err != nil {
    91  		t.Fatal(err)
    92  	}
    93  
    94  	queue.Close()
    95  
    96  	result, err := eventSearchService.Search(context.Background(), eventsearch.Options{Query: ""})
    97  	if err != nil {
    98  		t.Fatalf("eventSearchService.Search: %s", err)
    99  	}
   100  	if len(result.Events) != 1 {
   101  		t.Errorf("eventSearchService.Search: expected 1 hit. got %d", len(result.Events))
   102  	}
   103  
   104  	result, err = eventSearchService.Search(context.Background(), eventsearch.Options{
   105  		Filters: []eventsearch.Filter{
   106  			eventsearch.IDFilter{ID: e.ID},
   107  		},
   108  	},
   109  	)
   110  	if err != nil {
   111  		t.Fatalf("eventSearchService.Search: %s", err)
   112  	}
   113  	if len(result.Events) != 1 {
   114  		t.Errorf("eventSearchService.Search: expected 1 hit. got %d", len(result.Events))
   115  	}
   116  }
   117  
   118  func TestIndexRepeatingEventAndEventSearch(t *testing.T) {
   119  	db, cleanup, err := test.CreateSqliteTestDB(t.Name())
   120  	if err != nil {
   121  		t.Fatal(err)
   122  	}
   123  	defer cleanup()
   124  
   125  	queue := oqueue.NewQueue()
   126  
   127  	migrationStore, err := dbmigration.NewSqlStore(db)
   128  	if err != nil {
   129  		t.Fatal(err)
   130  	}
   131  	migrationService := dbmigration.NewService(migrationStore)
   132  
   133  	eventStore, err := event.NewSqlStore(db, migrationService)
   134  	if err != nil {
   135  		t.Fatal(err)
   136  	}
   137  	eventService := event.NewService(event.NewOperator(eventStore, queue), nil)
   138  
   139  	reventStore, err := revent.NewSqlStore(db, migrationService)
   140  	if err != nil {
   141  		t.Fatal(err)
   142  	}
   143  	reventService := revent.NewOperator(revent.NewService(reventStore, eventService), queue)
   144  
   145  	groupStore, err := group.NewSqlStore(db, migrationService)
   146  	if err != nil {
   147  		t.Fatal(err)
   148  	}
   149  	groupService := group.NewService(group.NewOperator(groupStore, queue))
   150  
   151  	placeStore, err := place.NewSqlStore(db, migrationService)
   152  	if err != nil {
   153  		t.Fatal(err)
   154  	}
   155  	placeService := place.NewService(place.NewOperator(placeStore, queue))
   156  
   157  	bleveIndex, cleanupIndex := test.CreateBleveTestIndex("TestRepeatingEventAndEventSearch")
   158  	searchService, err := search.NewService(bleveIndex, time.Second, 1, 1, time.UTC)
   159  	if err != nil {
   160  		t.Fatalf("seach.NewService: %s", err)
   161  	}
   162  	t.Cleanup(cleanupIndex)
   163  	defer searchService.Stop()
   164  
   165  	eventSearchService := eventsearch.NewService(searchService, eventService, groupService, placeService, reventService)
   166  	queue.AddSubscriber(eventSearchService.ConsumeOperation, 1)
   167  
   168  	e, err := reventService.Create(
   169  		auth.ContextWithID(context.Background(), "foo"),
   170  		&revent.NewRepeatingEvent{
   171  			Name: "test",
   172  			Intervals: []revent.Interval{
   173  				{Type: revent.IntervalWeek, Interval: 1},
   174  			},
   175  		},
   176  	)
   177  	if err != nil {
   178  		t.Fatal(err)
   179  	}
   180  	repeatingEvents, err := reventService.GenerateEvents(
   181  		auth.ContextWithID(context.Background(), "foo"),
   182  		e.ID,
   183  		time.Date(2022, 1, 1, 0, 0, 0, 0, time.UTC),
   184  		time.Date(2022, 3, 1, 0, 0, 0, 0, time.UTC),
   185  	)
   186  	if err != nil {
   187  		t.Fatal(err)
   188  	}
   189  
   190  	queue.Close()
   191  
   192  	result, err := eventSearchService.Search(context.Background(), eventsearch.Options{Query: ""})
   193  	if err != nil {
   194  		t.Fatalf("eventSearchService.Search: %s", err)
   195  	}
   196  	if len(result.Events) != len(repeatingEvents) {
   197  		t.Errorf("eventSearchService.Search: expected %d hit. got %d", len(repeatingEvents), len(result.Events))
   198  	}
   199  }
   200  
   201  func cleanupIndex(name string) error {
   202  	return os.RemoveAll(name)
   203  }