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	"encoding/json"
10	"testing"
11)
12
13func TestUpdateWithScript(t *testing.T) {
14	client := setupTestClientAndCreateIndexAndAddDocs(t) // , SetTraceLog(log.New(os.Stdout, "", 0)))
15
16	// Get original
17	getRes, err := client.Get().Index(testIndexName).Type("doc").Id("1").Do(context.TODO())
18	if err != nil {
19		t.Fatal(err)
20	}
21	var original tweet
22	if err := json.Unmarshal(*getRes.Source, &original); err != nil {
23		t.Fatal(err)
24	}
25
26	// Update with script
27	updRes, err := client.Update().Index(testIndexName).Type("doc").Id("1").
28		Script(
29			NewScript(`ctx._source.message = "Updated message text."`).Lang("painless"),
30		).
31		Do(context.TODO())
32	if err != nil {
33		t.Fatal(err)
34	}
35	if updRes == nil {
36		t.Fatal("response is nil")
37	}
38	if want, have := "updated", updRes.Result; want != have {
39		t.Fatalf("want Result = %q, have %v", want, have)
40	}
41
42	// Get new version
43	getRes, err = client.Get().Index(testIndexName).Type("doc").Id("1").Do(context.TODO())
44	if err != nil {
45		t.Fatal(err)
46	}
47	var updated tweet
48	if err := json.Unmarshal(*getRes.Source, &updated); err != nil {
49		t.Fatal(err)
50	}
51
52	if want, have := original.User, updated.User; want != have {
53		t.Fatalf("want User = %q, have %v", want, have)
54	}
55	if want, have := "Updated message text.", updated.Message; want != have {
56		t.Fatalf("want Message = %q, have %v", want, have)
57	}
58}
59
60func TestUpdateWithScriptID(t *testing.T) {
61	client := setupTestClientAndCreateIndexAndAddDocs(t) //, SetTraceLog(log.New(os.Stdout, "", 0)))
62
63	// Get original
64	getRes, err := client.Get().Index(testIndexName).Type("doc").Id("1").Do(context.TODO())
65	if err != nil {
66		t.Fatal(err)
67	}
68	var original tweet
69	if err := json.Unmarshal(*getRes.Source, &original); err != nil {
70		t.Fatal(err)
71	}
72
73	// Set script with ID
74	scriptID := "example-script-id"
75	_, err = client.DeleteScript().Id(scriptID).Do(context.Background())
76	if err != nil && !IsNotFound(err) {
77		t.Fatal(err)
78	}
79	_, err = client.PutScript().
80		Id(scriptID).
81		BodyString(`{
82			"script": {
83				"lang": "painless",
84				"source": "ctx._source.message = params.new_message"
85			}
86		}`).
87		Do(context.Background())
88	if err != nil {
89		t.Fatal(err)
90	}
91
92	// Update with script
93	updRes, err := client.Update().Index(testIndexName).Type("doc").Id("1").
94		Script(
95			NewScriptStored(scriptID).Param("new_message", "Updated message text."),
96		).
97		Do(context.TODO())
98	if err != nil {
99		t.Fatal(err)
100	}
101	if updRes == nil {
102		t.Fatal("response is nil")
103	}
104	if want, have := "updated", updRes.Result; want != have {
105		t.Fatalf("want Result = %q, have %v", want, have)
106	}
107
108	// Get new version
109	getRes, err = client.Get().Index(testIndexName).Type("doc").Id("1").Do(context.TODO())
110	if err != nil {
111		t.Fatal(err)
112	}
113	var updated tweet
114	if err := json.Unmarshal(*getRes.Source, &updated); err != nil {
115		t.Fatal(err)
116	}
117
118	if want, have := original.User, updated.User; want != have {
119		t.Fatalf("want User = %q, have %v", want, have)
120	}
121	if want, have := "Updated message text.", updated.Message; want != have {
122		t.Fatalf("want Message = %q, have %v", want, have)
123	}
124}
125