22
33import io .kestra .core .junit .annotations .KestraTest ;
44import io .kestra .core .models .property .Property ;
5- import io .kestra .core .runners .RunContext ;
65import io .kestra .core .runners .RunContextFactory ;
7- import io .kestra .plugin .aws .AbstractLocalStackTest ;
86import jakarta .inject .Inject ;
97import org .junit .jupiter .api .Test ;
8+ import software .amazon .awssdk .services .cloudwatch .CloudWatchClient ;
9+ import software .amazon .awssdk .services .cloudwatch .model .Datapoint ;
10+ import software .amazon .awssdk .services .cloudwatch .model .GetMetricStatisticsRequest ;
11+ import software .amazon .awssdk .services .cloudwatch .model .GetMetricStatisticsResponse ;
1012
1113import java .time .Duration ;
14+ import java .time .Instant ;
1215import java .util .List ;
13- import java .util .Map ;
1416
1517import static org .hamcrest .MatcherAssert .assertThat ;
1618import static org .hamcrest .Matchers .*;
19+ import static org .mockito .ArgumentMatchers .any ;
20+ import static org .mockito .Mockito .*;
1721
1822@ KestraTest
19- class QueryTest extends AbstractLocalStackTest {
23+ class QueryTest {
2024
2125 @ Inject
2226 protected RunContextFactory runContextFactory ;
2327
2428 @ Test
2529 void runQueryMetric () throws Exception {
26- RunContext runContext = runContextFactory .of ();
30+ var runContext = runContextFactory .of ();
31+ var client = mock (CloudWatchClient .class );
2732
28- var push = Push .builder ()
29- .endpointOverride (Property .ofValue (localstack .getEndpoint ().toString ()))
30- .region (Property .ofValue (localstack .getRegion ()))
31- .accessKeyId (Property .ofValue (localstack .getAccessKey ()))
32- .secretKeyId (Property .ofValue (localstack .getSecretKey ()))
33- .namespace (Property .ofValue ("Custom/Test" ))
34- .metrics (Property .ofValue (List .of (
35- Push .MetricValue .builder ()
36- .metricName (Property .ofValue ("LatencyMs" ))
37- .value (Property .ofValue (123.45 ))
38- .unit (Property .ofValue ("Milliseconds" ))
39- .dimensions (Property .ofValue (Map .of ("env" , "dev" )))
40- .build ()
41- )))
42- .build ();
33+ var oldTimestamp = Instant .parse ("2026-02-12T16:00:00Z" );
34+ var newTimestamp = Instant .parse ("2026-02-12T16:01:00Z" );
35+ when (client .getMetricStatistics (any (GetMetricStatisticsRequest .class ))).thenReturn (GetMetricStatisticsResponse .builder ()
36+ .datapoints (
37+ Datapoint .builder ().timestamp (newTimestamp ).average (22.0 ).build (),
38+ Datapoint .builder ().timestamp (oldTimestamp ).average (11.0 ).build ()
39+ )
40+ .build ());
4341
44- push .run (runContext );
45-
46- var query = Query .builder ()
47- .endpointOverride (Property .ofValue (localstack .getEndpoint ().toString ()))
48- .region (Property .ofValue (localstack .getRegion ()))
49- .accessKeyId (Property .ofValue (localstack .getAccessKey ()))
50- .secretKeyId (Property .ofValue (localstack .getSecretKey ()))
42+ var query = spy (Query .builder ()
5143 .namespace (Property .ofValue ("Custom/Test" ))
5244 .metricName (Property .ofValue ("LatencyMs" ))
5345 .statistic (Property .ofValue ("Average" ))
@@ -59,11 +51,18 @@ void runQueryMetric() throws Exception {
5951 .value (Property .ofValue ("dev" ))
6052 .build ()
6153 )))
62- .build ();
54+ .build ());
55+
56+ doReturn (client ).when (query ).client (any ());
6357
64- Query . Output out = query .run (runContext );
58+ var out = query .run (runContext );
6559
66- assertThat (out .getSeries (), notNullValue ());
67- assertThat (out .getCount (), greaterThanOrEqualTo (0 ));
60+ assertThat (out .getCount (), is (2 ));
61+ assertThat (out .getSeries (), hasSize (2 ));
62+ assertThat (out .getSeries ().getFirst ().values (), hasItem (oldTimestamp .toString ()));
63+ assertThat (out .getSeries ().get (1 ).values (), hasItem (newTimestamp .toString ()));
64+ assertThat (out .getSeries ().getFirst ().values (), hasItem (11.0 ));
65+ assertThat (out .getSeries ().get (1 ).values (), hasItem (22.0 ));
66+ verify (client , times (1 )).getMetricStatistics (any (GetMetricStatisticsRequest .class ));
6867 }
6968}
0 commit comments