package models

import (
	"reflect"
	"testing"
)

func TestSearchQuery_setFilter(t *testing.T) {
	type fields struct {
		query *SearchQuery
	}
	type args struct {
		filters []*Filter
	}
	tests := []struct {
		name   string
		fields fields
		args   args
		want   *SearchQuery
	}{
		{
			name:   "set idFilter",
			fields: fields{query: NewSearchQuery()},
			args: args{filters: []*Filter{
				{field: Field_AggregateID, operation: Operation_Equals, value: "hodor"},
			}},
			want: &SearchQuery{Filters: []*Filter{
				{field: Field_AggregateID, operation: Operation_Equals, value: "hodor"},
			}},
		},
		{
			name:   "overwrite idFilter",
			fields: fields{query: NewSearchQuery()},
			args: args{filters: []*Filter{
				{field: Field_AggregateID, operation: Operation_Equals, value: "hodor"},
				{field: Field_AggregateID, operation: Operation_Equals, value: "ursli"},
			}},
			want: &SearchQuery{Filters: []*Filter{
				{field: Field_AggregateID, operation: Operation_Equals, value: "ursli"},
			}},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got := tt.fields.query
			for _, filter := range tt.args.filters {
				got = got.setFilter(filter)
			}
			for _, wantFilter := range tt.want.Filters {
				found := false
				for _, gotFilter := range got.Filters {
					if gotFilter.field == wantFilter.field {
						found = true
						if !reflect.DeepEqual(wantFilter, gotFilter) {
							t.Errorf("filter not as expected: want: %v got %v", wantFilter, gotFilter)
						}
					}
				}
				if !found {
					t.Errorf("filter field %v not found", wantFilter.field)
				}
			}
		})
	}
}