This is an automated email from the ASF dual-hosted git repository.
ningjiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-saga.git
The following commit(s) were added to refs/heads/master by this push:
new ec73b69 Add Unit Test for Alpha Console API's
ec73b69 is described below
commit ec73b690d48dd5e7185eb2be48809bb748f261f9
Author: asifdxtreme <[email protected]>
AuthorDate: Wed Nov 14 17:45:03 2018 +0530
Add Unit Test for Alpha Console API's
---
.../alpha/server/console/saga/model/Stats.java | 55 +++---
.../saga/SagaTransactionsControllerTest.java | 198 +++++++++++++++++++++
2 files changed, 228 insertions(+), 25 deletions(-)
diff --git
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/console/saga/model/Stats.java
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/console/saga/model/Stats.java
index befaa03..d2ed520 100644
---
a/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/console/saga/model/Stats.java
+++
b/alpha/alpha-server/src/main/java/org/apache/servicecomb/saga/alpha/server/console/saga/model/Stats.java
@@ -20,6 +20,36 @@ import java.util.Date;
public class Stats {
+ private int totalTransactions;
+
+ private int pendingTransactions;
+
+ private int committedTransactions;
+
+ private int compensatingTransactions;
+
+ private int rollbackTransactions;
+
+ private Date updatedAt;
+
+ private int failureRate;
+
+ public Stats(int totalTransactions, int pendingTransactions, int
committedTransactions, int compensatingTransactions,
+ int rollbackTransactions) {
+ setTotalTransactions(totalTransactions);
+ setPendingTransactions(pendingTransactions);
+ setCommittedTransactions(committedTransactions);
+ setCompensatingTransactions(compensatingTransactions);
+ setRollbackTransactions(rollbackTransactions);
+ if (totalTransactions > 0 && rollbackTransactions +
compensatingTransactions > 0) {
+ setFailureRate((rollbackTransactions + compensatingTransactions) * 100 /
totalTransactions);
+ } else {
+ setFailureRate(0);
+ }
+
+ setUpdatedAt(new Date());
+ }
+
public int getTotalTransactions() {
return totalTransactions;
}
@@ -28,8 +58,6 @@ public class Stats {
this.totalTransactions = totalTransactions;
}
- private int totalTransactions;
-
public int getPendingTransactions() {
return pendingTransactions;
}
@@ -62,14 +90,6 @@ public class Stats {
this.rollbackTransactions = rollbackTransactions;
}
- private int pendingTransactions;
-
- private int committedTransactions;
-
- private int compensatingTransactions;
-
- private int rollbackTransactions;
-
public Date getUpdatedAt() {
return updatedAt;
}
@@ -78,8 +98,6 @@ public class Stats {
this.updatedAt = updatedAt;
}
- private Date updatedAt;
-
public int getFailureRate() {
return failureRate;
}
@@ -87,17 +105,4 @@ public class Stats {
public void setFailureRate(int failureRate) {
this.failureRate = failureRate;
}
-
- private int failureRate;
-
- public Stats(int totalTransactions, int pendingTransactions, int
committedTransactions, int compensatingTransactions,
- int rollbackTransactions) {
- setTotalTransactions(totalTransactions);
- setPendingTransactions(pendingTransactions);
- setCommittedTransactions(committedTransactions);
- setCompensatingTransactions(compensatingTransactions);
- setRollbackTransactions(rollbackTransactions);
- setFailureRate(rollbackTransactions + compensatingTransactions /
totalTransactions);
- setUpdatedAt(new Date());
- }
}
diff --git
a/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/console/saga/SagaTransactionsControllerTest.java
b/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/console/saga/SagaTransactionsControllerTest.java
new file mode 100644
index 0000000..a4ce983
--- /dev/null
+++
b/alpha/alpha-server/src/test/java/org/apache/servicecomb/saga/alpha/server/console/saga/SagaTransactionsControllerTest.java
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.servicecomb.saga.alpha.server.console.saga;
+
+import static com.seanyinx.github.unit.scaffolding.Randomness.uniquify;
+import static java.util.Collections.singletonList;
+import static org.apache.servicecomb.saga.common.EventType.SagaEndedEvent;
+import static org.apache.servicecomb.saga.common.EventType.SagaStartedEvent;
+import static org.apache.servicecomb.saga.common.EventType.TxAbortedEvent;
+import static org.apache.servicecomb.saga.common.EventType.TxCompensatedEvent;
+import static org.apache.servicecomb.saga.common.EventType.TxEndedEvent;
+import static org.apache.servicecomb.saga.common.EventType.TxStartedEvent;
+import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
+import static org.hamcrest.core.Is.is;
+import static org.mockito.Mockito.when;
+import static
org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static
org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static
org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.servicecomb.saga.alpha.core.TxEvent;
+import org.apache.servicecomb.saga.alpha.server.TxEventEnvelopeRepository;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.boot.test.mock.mockito.MockBean;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest(SagaTransactionsController.class)
+public class SagaTransactionsControllerTest {
+ private final TxEvent someEvent = populateEvents(TxStartedEvent.name());
+
+ List<TxEvent> eventStarted, eventCompensated, eventCommitted,
committedTransactions, compensatingTransaction, pendingTransactions,
rollbackedTransactions, allTransactions;
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockBean
+ private TxEventEnvelopeRepository eventRepository;
+
+ @Before
+ public void setUp() throws Exception {
+ when(eventRepository.findAll()).thenReturn(singletonList(someEvent));
+ when(eventRepository.findTotalCountOfTransactions()).thenReturn(10);
+ when(eventRepository.findCountOfCommittedEvents()).thenReturn(5);
+ when(eventRepository.findCountOfPendingEvents()).thenReturn(1);
+ when(eventRepository.findCountOfRollBackedEvents()).thenReturn(2);
+ when(eventRepository.findCountOfCompensatingEvents()).thenReturn(2);
+
+ // Populate events for /recent API's
+ eventStarted = new LinkedList<>();
+ eventStarted.add(populateEvents(TxStartedEvent.name()));
+ when(eventRepository.findPendingEvents(new PageRequest(0,
5))).thenReturn(eventStarted);
+ when(eventRepository.findCompensatingEvents(new PageRequest(0,
5))).thenReturn(eventStarted);
+
+ eventCompensated = new LinkedList<>();
+ eventCompensated.add(populateEvents(TxCompensatedEvent.name()));
+ when(eventRepository.findRollBackedEvents(new PageRequest(0,
5))).thenReturn(eventCompensated);
+
+ eventCommitted = new LinkedList<>();
+ eventCommitted.add(populateEvents(TxEndedEvent.name()));
+ eventCommitted.add(populateEvents(SagaEndedEvent.name()));
+ when(eventRepository.findCommittedEvents(new PageRequest(0,
5))).thenReturn(eventCommitted);
+
+ // Populate events for /transactions
+ pendingTransactions = new LinkedList<>();
+ pendingTransactions.add(populateEvents(SagaStartedEvent.name()));
+ pendingTransactions.add(populateEvents(TxStartedEvent.name()));
+ when(eventRepository.findPendingEvents()).thenReturn(pendingTransactions);
+
+ compensatingTransaction = new LinkedList<>();
+ compensatingTransaction.add(populateEvents(SagaStartedEvent.name()));
+ compensatingTransaction.add(populateEvents(TxStartedEvent.name()));
+ compensatingTransaction.add(populateEvents(TxAbortedEvent.name()));
+
when(eventRepository.findCompensatingEvents()).thenReturn(compensatingTransaction);
+
+ rollbackedTransactions = new LinkedList<>();
+ rollbackedTransactions.add(populateEvents(SagaStartedEvent.name()));
+ rollbackedTransactions.add(populateEvents(TxStartedEvent.name()));
+ rollbackedTransactions.add(populateEvents(TxAbortedEvent.name()));
+ rollbackedTransactions.add(populateEvents(TxCompensatedEvent.name()));
+ rollbackedTransactions.add(populateEvents(TxEndedEvent.name()));
+
when(eventRepository.findRollBackedEvents()).thenReturn(rollbackedTransactions);
+
+ committedTransactions = new LinkedList<>();
+ committedTransactions.add(populateEvents(SagaStartedEvent.name()));
+ committedTransactions.add(populateEvents(TxStartedEvent.name()));
+ committedTransactions.add(populateEvents(TxEndedEvent.name()));
+ committedTransactions.add(populateEvents(SagaEndedEvent.name()));
+
when(eventRepository.findCommittedEvents()).thenReturn(committedTransactions);
+
+ // Populate events for /findTransactions
+
when(eventRepository.findByGlobalTxId("XXXGID")).thenReturn(committedTransactions);
+
when(eventRepository.findByServiceName("XXService")).thenReturn(singletonList(someEvent));
+ }
+
+ @Test
+ public void getDashboardStats() throws Exception {
+ mockMvc.perform(get("/saga/stats"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.totalTransactions", is(10)))
+ .andExpect(jsonPath("$.committedTransactions", is(5)))
+ .andExpect(jsonPath("$.pendingTransactions", is(1)))
+ .andExpect(jsonPath("$.compensatingTransactions", is(2)))
+ .andExpect(jsonPath("$.failureRate", is(40)))
+ .andExpect(jsonPath("$.rollbackTransactions", is(2)));
+ }
+
+
+ @Test
+ public void getRecentTransactionsTest() throws Exception {
+ mockMvc.perform(get("/saga/recent?status=PENDING&count=5"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(1)));
+ mockMvc.perform(get("/saga/recent?status=COMMITTED&count=5"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(2)));
+ mockMvc.perform(get("/saga/recent?status=COMPENSATING&count=5"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(1)));
+ mockMvc.perform(get("/saga/recent?status=ROLLBACKED&count=5"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(1)));
+ mockMvc.perform(get("/saga/recent?status=FAILURECondition&count=5"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(0)));
+ }
+
+ @Test
+ public void getTransactionsTest() throws Exception {
+ mockMvc.perform(get("/saga/transactions?status=PENDING"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(2)));
+ mockMvc.perform(get("/saga/transactions?status=COMMITTED"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(4)));
+ mockMvc.perform(get("/saga/transactions?status=COMPENSATING"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(3)));
+ mockMvc.perform(get("/saga/transactions?status=ROLLBACKED"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(5)));
+ mockMvc.perform(get("/saga/transactions?status=ALL"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(1)));
+ mockMvc.perform(get("/saga/transactions?status=FAILURECondition"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(0)));
+ }
+
+ @Test
+ public void findTransactionsTest() throws Exception {
+ mockMvc.perform(get("/saga/findTransactions?globalTxID=XXXGID"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(4)));
+ mockMvc.perform(get("/saga/findTransactions?microServiceName=XXService"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(1)));
+ mockMvc.perform(get("/saga/findTransactions"))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$", hasSize(0)));
+ }
+
+ private TxEvent populateEvents(String type) {
+ return new TxEvent(
+ uniquify("serviceName"),
+ uniquify("instanceId"),
+ uniquify("globalTxId"),
+ uniquify("localTxId"),
+ UUID.randomUUID().toString(),
+ type,
+ this.getClass().getCanonicalName(),
+ uniquify("blah").getBytes());
+ }
+}
\ No newline at end of file