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	"encoding/json"
9	"testing"
10)
11
12func TestDateRangeAggregation(t *testing.T) {
13	agg := NewDateRangeAggregation().Field("created_at").TimeZone("UTC")
14	agg = agg.AddRange(nil, "2012-12-31")
15	agg = agg.AddRange("2013-01-01", "2013-12-31")
16	agg = agg.AddRange("2014-01-01", nil)
17	src, err := agg.Source()
18	if err != nil {
19		t.Fatal(err)
20	}
21	data, err := json.Marshal(src)
22	if err != nil {
23		t.Fatalf("marshaling to JSON failed: %v", err)
24	}
25	got := string(data)
26	expected := `{"date_range":{"field":"created_at","ranges":[{"to":"2012-12-31"},{"from":"2013-01-01","to":"2013-12-31"},{"from":"2014-01-01"}],"time_zone":"UTC"}}`
27	if got != expected {
28		t.Errorf("expected\n%s\n,got:\n%s", expected, got)
29	}
30}
31
32func TestDateRangeAggregationWithPointers(t *testing.T) {
33	d1 := "2012-12-31"
34	d2 := "2013-01-01"
35	d3 := "2013-12-31"
36	d4 := "2014-01-01"
37
38	agg := NewDateRangeAggregation().Field("created_at")
39	agg = agg.AddRange(nil, &d1)
40	agg = agg.AddRange(d2, &d3)
41	agg = agg.AddRange(d4, nil)
42	src, err := agg.Source()
43	if err != nil {
44		t.Fatal(err)
45	}
46	data, err := json.Marshal(src)
47	if err != nil {
48		t.Fatalf("marshaling to JSON failed: %v", err)
49	}
50	got := string(data)
51	expected := `{"date_range":{"field":"created_at","ranges":[{"to":"2012-12-31"},{"from":"2013-01-01","to":"2013-12-31"},{"from":"2014-01-01"}]}}`
52	if got != expected {
53		t.Errorf("expected\n%s\n,got:\n%s", expected, got)
54	}
55}
56
57func TestDateRangeAggregationWithUnbounded(t *testing.T) {
58	agg := NewDateRangeAggregation().Field("created_at").
59		AddUnboundedFrom("2012-12-31").
60		AddRange("2013-01-01", "2013-12-31").
61		AddUnboundedTo("2014-01-01")
62	src, err := agg.Source()
63	if err != nil {
64		t.Fatal(err)
65	}
66	data, err := json.Marshal(src)
67	if err != nil {
68		t.Fatalf("marshaling to JSON failed: %v", err)
69	}
70	got := string(data)
71	expected := `{"date_range":{"field":"created_at","ranges":[{"to":"2012-12-31"},{"from":"2013-01-01","to":"2013-12-31"},{"from":"2014-01-01"}]}}`
72	if got != expected {
73		t.Errorf("expected\n%s\n,got:\n%s", expected, got)
74	}
75}
76
77func TestDateRangeAggregationWithLtAndCo(t *testing.T) {
78	agg := NewDateRangeAggregation().Field("created_at").
79		Lt("2012-12-31").
80		Between("2013-01-01", "2013-12-31").
81		Gt("2014-01-01")
82	src, err := agg.Source()
83	if err != nil {
84		t.Fatal(err)
85	}
86	data, err := json.Marshal(src)
87	if err != nil {
88		t.Fatalf("marshaling to JSON failed: %v", err)
89	}
90	got := string(data)
91	expected := `{"date_range":{"field":"created_at","ranges":[{"to":"2012-12-31"},{"from":"2013-01-01","to":"2013-12-31"},{"from":"2014-01-01"}]}}`
92	if got != expected {
93		t.Errorf("expected\n%s\n,got:\n%s", expected, got)
94	}
95}
96
97func TestDateRangeAggregationWithKeyedFlag(t *testing.T) {
98	agg := NewDateRangeAggregation().Field("created_at").
99		Keyed(true).
100		Lt("2012-12-31").
101		Between("2013-01-01", "2013-12-31").
102		Gt("2014-01-01")
103	src, err := agg.Source()
104	if err != nil {
105		t.Fatal(err)
106	}
107	data, err := json.Marshal(src)
108	if err != nil {
109		t.Fatalf("marshaling to JSON failed: %v", err)
110	}
111	got := string(data)
112	expected := `{"date_range":{"field":"created_at","keyed":true,"ranges":[{"to":"2012-12-31"},{"from":"2013-01-01","to":"2013-12-31"},{"from":"2014-01-01"}]}}`
113	if got != expected {
114		t.Errorf("expected\n%s\n,got:\n%s", expected, got)
115	}
116}
117
118func TestDateRangeAggregationWithKeys(t *testing.T) {
119	agg := NewDateRangeAggregation().Field("created_at").
120		Keyed(true).
121		LtWithKey("pre-2012", "2012-12-31").
122		BetweenWithKey("2013", "2013-01-01", "2013-12-31").
123		GtWithKey("post-2013", "2014-01-01")
124	src, err := agg.Source()
125	if err != nil {
126		t.Fatal(err)
127	}
128	data, err := json.Marshal(src)
129	if err != nil {
130		t.Fatalf("marshaling to JSON failed: %v", err)
131	}
132	got := string(data)
133	expected := `{"date_range":{"field":"created_at","keyed":true,"ranges":[{"key":"pre-2012","to":"2012-12-31"},{"from":"2013-01-01","key":"2013","to":"2013-12-31"},{"from":"2014-01-01","key":"post-2013"}]}}`
134	if got != expected {
135		t.Errorf("expected\n%s\n,got:\n%s", expected, got)
136	}
137}
138
139func TestDateRangeAggregationWithSpecialNames(t *testing.T) {
140	agg := NewDateRangeAggregation().Field("created_at").
141		AddRange("now-10M/M", "now+10M/M")
142	src, err := agg.Source()
143	if err != nil {
144		t.Fatal(err)
145	}
146	data, err := json.Marshal(src)
147	if err != nil {
148		t.Fatalf("marshaling to JSON failed: %v", err)
149	}
150	got := string(data)
151	expected := `{"date_range":{"field":"created_at","ranges":[{"from":"now-10M/M","to":"now+10M/M"}]}}`
152	if got != expected {
153		t.Errorf("expected\n%s\n,got:\n%s", expected, got)
154	}
155}
156