eintopf.info@v0.13.16/service/eventsearch/index_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 eventsearch_test
    17  
    18  import (
    19  	"context"
    20  	"testing"
    21  	"time"
    22  
    23  	"github.com/google/go-cmp/cmp"
    24  	"github.com/google/go-cmp/cmp/cmpopts"
    25  
    26  	"eintopf.info/service/auth"
    27  	"eintopf.info/service/event"
    28  	"eintopf.info/service/eventsearch"
    29  	"eintopf.info/service/group"
    30  	"eintopf.info/service/place"
    31  	"eintopf.info/service/revent"
    32  	"eintopf.info/service/search"
    33  	"eintopf.info/test"
    34  )
    35  
    36  func TestEventDocumentsFromEvent(t *testing.T) {
    37  	tests := []struct {
    38  		name string
    39  
    40  		events []*event.NewEvent
    41  		groups []*group.NewGroup
    42  		places []*place.NewPlace
    43  
    44  		event    *event.Event
    45  		wantDocs []*eventsearch.EventDocument
    46  	}{
    47  		{
    48  			name: "basics",
    49  			event: &event.Event{
    50  				Name:  "foo",
    51  				Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
    52  			},
    53  			wantDocs: []*eventsearch.EventDocument{
    54  				{
    55  					Name:       "foo",
    56  					Start:      time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
    57  					Date:       time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
    58  					MultiDay:   -1,
    59  					Organizers: []eventsearch.Organizer{},
    60  				},
    61  			},
    62  		},
    63  		{
    64  			name: "multi day",
    65  			event: &event.Event{
    66  				Name:  "foo",
    67  				Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
    68  				End:   tptr(time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC)),
    69  			},
    70  			wantDocs: []*eventsearch.EventDocument{
    71  				{
    72  					Name:       "foo",
    73  					Start:      time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
    74  					End:        tptr(time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC)),
    75  					MultiDay:   -2,
    76  					Organizers: []eventsearch.Organizer{},
    77  				},
    78  				{
    79  					Name:       "foo",
    80  					Start:      time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
    81  					End:        tptr(time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC)),
    82  					Date:       time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
    83  					MultiDay:   1,
    84  					Organizers: []eventsearch.Organizer{},
    85  				},
    86  				{
    87  					Name:       "foo",
    88  					Start:      time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
    89  					End:        tptr(time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC)),
    90  					Date:       time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC),
    91  					MultiDay:   2,
    92  					Organizers: []eventsearch.Organizer{},
    93  				},
    94  			},
    95  		},
    96  		{
    97  			name: "sub event",
    98  			events: []*event.NewEvent{
    99  				{
   100  					Name:      "bar",
   101  					Published: true,
   102  					Parent:    "id:abcd",
   103  					Start:     time.Date(2023, 3, 25, 16, 0, 0, 0, time.UTC),
   104  				},
   105  			},
   106  			event: &event.Event{
   107  				ID:    "abcd",
   108  				Name:  "foo",
   109  				Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
   110  			},
   111  			wantDocs: []*eventsearch.EventDocument{
   112  				{
   113  					ID:         "abcd",
   114  					Name:       "foo",
   115  					Start:      time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
   116  					Date:       time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
   117  					MultiDay:   -1,
   118  					Organizers: []eventsearch.Organizer{},
   119  					Children: []*eventsearch.EventDocument{
   120  						{
   121  							ID:         "0",
   122  							Published:  true,
   123  							Name:       "bar",
   124  							Start:      time.Date(2023, 3, 25, 16, 0, 0, 0, time.UTC),
   125  							Date:       time.Date(2023, 3, 25, 16, 0, 0, 0, time.UTC),
   126  							MultiDay:   -1,
   127  							Organizers: []eventsearch.Organizer{},
   128  						},
   129  					},
   130  				},
   131  			},
   132  		},
   133  		{
   134  			name: "multiday sub event",
   135  			events: []*event.NewEvent{
   136  				{
   137  					Name:      "bar",
   138  					Published: true,
   139  					Parent:    "id:abcd",
   140  					Start:     time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC),
   141  				},
   142  				{
   143  					Name:      "bar2",
   144  					Published: true,
   145  					Parent:    "id:abcd",
   146  					Start:     time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC),
   147  				},
   148  			},
   149  			event: &event.Event{
   150  				ID:    "abcd",
   151  				Name:  "foo",
   152  				Start: time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
   153  				End:   tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)),
   154  			},
   155  			wantDocs: []*eventsearch.EventDocument{
   156  				{
   157  					ID:         "abcd",
   158  					Name:       "foo",
   159  					Organizers: []eventsearch.Organizer{},
   160  					MultiDay:   -2,
   161  					Start:      time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
   162  					End:        tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)),
   163  					Children: []*eventsearch.EventDocument{
   164  						{
   165  							ID:         "0",
   166  							Published:  true,
   167  							Name:       "bar",
   168  							Start:      time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC),
   169  							Date:       time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC),
   170  							MultiDay:   -1,
   171  							Organizers: []eventsearch.Organizer{},
   172  						},
   173  						{
   174  							ID:         "1",
   175  							Published:  true,
   176  							Name:       "bar2",
   177  							Start:      time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC),
   178  							Date:       time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC),
   179  							MultiDay:   -1,
   180  							Organizers: []eventsearch.Organizer{},
   181  						},
   182  					},
   183  				},
   184  				{
   185  					ID:         "abcd",
   186  					Name:       "foo",
   187  					Start:      time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
   188  					End:        tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)),
   189  					Date:       time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
   190  					MultiDay:   1,
   191  					Organizers: []eventsearch.Organizer{},
   192  					Children:   []*eventsearch.EventDocument{},
   193  				},
   194  				{
   195  					ID:         "abcd",
   196  					Name:       "foo",
   197  					Start:      time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
   198  					End:        tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)),
   199  					Date:       time.Date(2023, 3, 26, 12, 0, 0, 0, time.UTC),
   200  					MultiDay:   2,
   201  					Organizers: []eventsearch.Organizer{},
   202  					Children: []*eventsearch.EventDocument{
   203  						{
   204  							ID:         "0",
   205  							Published:  true,
   206  							Name:       "bar",
   207  							Start:      time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC),
   208  							Date:       time.Date(2023, 3, 26, 16, 0, 0, 0, time.UTC),
   209  							MultiDay:   -1,
   210  							Organizers: []eventsearch.Organizer{},
   211  						},
   212  					},
   213  				},
   214  				{
   215  					ID:         "abcd",
   216  					Name:       "foo",
   217  					Start:      time.Date(2023, 3, 25, 12, 0, 0, 0, time.UTC),
   218  					End:        tptr(time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC)),
   219  					Date:       time.Date(2023, 3, 27, 12, 0, 0, 0, time.UTC),
   220  					MultiDay:   3,
   221  					Organizers: []eventsearch.Organizer{},
   222  					Children: []*eventsearch.EventDocument{
   223  						{
   224  							ID:         "1",
   225  							Published:  true,
   226  							Name:       "bar2",
   227  							Start:      time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC),
   228  							Date:       time.Date(2023, 3, 27, 11, 0, 0, 0, time.UTC),
   229  							MultiDay:   -1,
   230  							Organizers: []eventsearch.Organizer{},
   231  						},
   232  					},
   233  				},
   234  			},
   235  		},
   236  	}
   237  
   238  	for _, tc := range tests {
   239  		t.Run(tc.name, func(t *testing.T) {
   240  			index, cleanupIndex := test.CreateBleveTestIndex(tc.name)
   241  			t.Cleanup(cleanupIndex)
   242  			searchService, err := search.NewService(index, time.Second, 1, 1, time.UTC)
   243  			if err != nil {
   244  				t.Fatalf("search.NewService: %s", err)
   245  			}
   246  
   247  			eventService := event.NewService(event.NewMemoryStore(), nil)
   248  			groupService := group.NewService(group.NewMemoryStore())
   249  			placeService := place.NewService(place.NewMemoryStore())
   250  			reventService := revent.NewService(revent.NewMemoryStore(), eventService)
   251  
   252  			ctx := auth.ContextWithID(context.Background(), "my_id")
   253  			for _, e := range tc.events {
   254  				if _, err := eventService.Create(ctx, e); err != nil {
   255  					t.Fatalf("create events: %s", err)
   256  				}
   257  			}
   258  			for _, g := range tc.groups {
   259  				if _, err := groupService.Create(ctx, g); err != nil {
   260  					t.Fatalf("create group: %s", err)
   261  				}
   262  			}
   263  			for _, p := range tc.places {
   264  				if _, err := placeService.Create(ctx, p); err != nil {
   265  					t.Fatalf("create place: %s", err)
   266  				}
   267  			}
   268  
   269  			eventsearchService := eventsearch.NewService(searchService, eventService, groupService, placeService, reventService)
   270  			docs := eventsearchService.EventDocumentsFromEvent(tc.event)
   271  
   272  			if diff := cmp.Diff(tc.wantDocs, docs, cmpopts.IgnoreUnexported(eventsearch.EventDocument{})); diff != "" {
   273  				t.Errorf("docs mismatch (-want +got):\n%s", diff)
   274  			}
   275  		})
   276  	}
   277  }
   278  
   279  func TestEventDocumentSearchFields(t *testing.T) {
   280  	doc := &eventsearch.EventDocument{
   281  		ID:   "1",
   282  		Name: "foo",
   283  		Organizers: []eventsearch.Organizer{
   284  			{Name: "oar"},
   285  			{Group: &group.Group{ID: "aaa", Name: "foo"}},
   286  		},
   287  		Involved: []event.Involved{
   288  			{Name: "foo", Description: "foo bar foo"},
   289  		},
   290  		Location:    &eventsearch.Location{Name: "lar"},
   291  		Description: "one two three",
   292  		Date:        time.Date(2021, 4, 4, 10, 0, 0, 0, time.UTC),
   293  		Start:       time.Date(2021, 4, 4, 10, 0, 0, 0, time.UTC),
   294  		End:         tptr(time.Date(2021, 4, 7, 11, 0, 0, 0, time.UTC)),
   295  		Tags:        []string{"a", "b"},
   296  		Published:   true,
   297  		Listed:      false,
   298  	}
   299  	searchFields := doc.SearchFields()
   300  	want := map[string]interface{}{
   301  		"is":         []string{"a", "b", "event"},
   302  		"id":         "1",
   303  		"organizers": []string{"oar", "foo"},
   304  		"groupID":    []string{"aaa"},
   305  		"involved":   []string{`{"name":"foo","description":"foo bar foo"}`},
   306  		"location":   "lar",
   307  		"location2":  "",
   308  		"placeID":    "",
   309  		"tag":        []string{"a", "b"},
   310  		"name":       "foo",
   311  		"start":      time.Date(2021, 4, 4, 10, 0, 0, 0, time.UTC),
   312  		"end":        tptr(time.Date(2021, 4, 7, 11, 0, 0, 0, time.UTC)),
   313  		"date":       time.Date(2021, 4, 4, 10, 0, 0, 0, time.UTC),
   314  		"day":        time.Date(2021, 4, 4, 0, 0, 0, 0, time.UTC),
   315  		"multiday":   0,
   316  		"listed":     false,
   317  		"published":  true,
   318  		"ownedBy":    []string(nil),
   319  		"children":   false,
   320  	}
   321  
   322  	if diff := cmp.Diff(want, searchFields); diff != "" {
   323  		t.Errorf("searchFields mismatch (-want +got):\n%s", diff)
   324  	}
   325  }
   326  
   327  func tptr(t time.Time) *time.Time {
   328  	return &t
   329  }