1// Copyright 2012-present Oliver Eilhard. All rights reserved.
2// Use of this source code is governed by a MIT-license.
3// See http://olivere.mit-license.org/license.txt for details.
4
5package elastic
6
7import (
8	"context"
9	"testing"
10)
11
12func TestDeleteByQueryBuildURL(t *testing.T) {
13	client := setupTestClient(t)
14
15	tests := []struct {
16		Indices   []string
17		Types     []string
18		Expected  string
19		ExpectErr bool
20	}{
21		{
22			[]string{},
23			[]string{},
24			"",
25			true,
26		},
27		{
28			[]string{"index1"},
29			[]string{},
30			"/index1/_delete_by_query",
31			false,
32		},
33		{
34			[]string{"index1", "index2"},
35			[]string{},
36			"/index1%2Cindex2/_delete_by_query",
37			false,
38		},
39		{
40			[]string{},
41			[]string{"type1"},
42			"",
43			true,
44		},
45		{
46			[]string{"index1"},
47			[]string{"type1"},
48			"/index1/type1/_delete_by_query",
49			false,
50		},
51		{
52			[]string{"index1", "index2"},
53			[]string{"type1", "type2"},
54			"/index1%2Cindex2/type1%2Ctype2/_delete_by_query",
55			false,
56		},
57	}
58
59	for i, test := range tests {
60		builder := client.DeleteByQuery().Index(test.Indices...).Type(test.Types...)
61		err := builder.Validate()
62		if err != nil {
63			if !test.ExpectErr {
64				t.Errorf("case #%d: %v", i+1, err)
65				continue
66			}
67		} else {
68			// err == nil
69			if test.ExpectErr {
70				t.Errorf("case #%d: expected error", i+1)
71				continue
72			}
73			path, _, _ := builder.buildURL()
74			if path != test.Expected {
75				t.Errorf("case #%d: expected %q; got: %q", i+1, test.Expected, path)
76			}
77		}
78	}
79}
80
81func TestDeleteByQuery(t *testing.T) {
82	// client := setupTestClientAndCreateIndex(t, SetTraceLog(log.New(os.Stdout, "", 0)))
83	client := setupTestClientAndCreateIndex(t)
84
85	tweet1 := tweet{User: "olivere", Message: "Welcome to Golang and Elasticsearch."}
86	tweet2 := tweet{User: "olivere", Message: "Another unrelated topic."}
87	tweet3 := tweet{User: "sandrae", Message: "Cycling is fun."}
88
89	// Add all documents
90	_, err := client.Index().Index(testIndexName).Type("tweet").Id("1").BodyJson(&tweet1).Do(context.TODO())
91	if err != nil {
92		t.Fatal(err)
93	}
94
95	_, err = client.Index().Index(testIndexName).Type("tweet").Id("2").BodyJson(&tweet2).Do(context.TODO())
96	if err != nil {
97		t.Fatal(err)
98	}
99
100	_, err = client.Index().Index(testIndexName).Type("tweet").Id("3").BodyJson(&tweet3).Do(context.TODO())
101	if err != nil {
102		t.Fatal(err)
103	}
104
105	_, err = client.Flush().Index(testIndexName).Do(context.TODO())
106	if err != nil {
107		t.Fatal(err)
108	}
109
110	// Count documents
111	count, err := client.Count(testIndexName).Do(context.TODO())
112	if err != nil {
113		t.Fatal(err)
114	}
115	if count != 3 {
116		t.Fatalf("expected count = %d; got: %d", 3, count)
117	}
118
119	// Delete all documents by sandrae
120	q := NewTermQuery("user", "sandrae")
121	res, err := client.DeleteByQuery().
122		Index(testIndexName).
123		Type("tweet").
124		Query(q).
125		Pretty(true).
126		Do(context.TODO())
127	if err != nil {
128		t.Fatal(err)
129	}
130	if res == nil {
131		t.Fatalf("expected response != nil; got: %v", res)
132	}
133
134	// Flush and check count
135	_, err = client.Flush().Index(testIndexName).Do(context.TODO())
136	if err != nil {
137		t.Fatal(err)
138	}
139	count, err = client.Count(testIndexName).Do(context.TODO())
140	if err != nil {
141		t.Fatal(err)
142	}
143	if count != 2 {
144		t.Fatalf("expected Count = %d; got: %d", 2, count)
145	}
146}
147