2 * Copyright 2005-2010 the original author or authors.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org.wamblee.wicket.transactions;
18 import static junit.framework.Assert.*;
19 import static org.mockito.Mockito.*;
21 import javax.naming.InitialContext;
22 import javax.transaction.Status;
23 import javax.transaction.UserTransaction;
25 import org.apache.wicket.Page;
26 import org.apache.wicket.Request;
27 import org.apache.wicket.RequestCycle;
28 import org.apache.wicket.Response;
29 import org.apache.wicket.WicketRuntimeException;
30 import org.apache.wicket.protocol.http.WebApplication;
31 import org.apache.wicket.protocol.http.WebRequest;
32 import org.apache.wicket.util.tester.WicketTester;
33 import org.junit.After;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.mockito.InOrder;
37 import org.mockito.invocation.InvocationOnMock;
38 import org.mockito.stubbing.Answer;
39 import org.wamblee.test.jndi.StubInitialContextFactory;
41 public class OpenTransactionInViewRequestCycleTest {
43 private UserTransaction userTransaction;
44 private WicketTester wicket;
46 private static Runnable BEHAVIOR;
48 public static Runnable getBEHAVIOR() {
53 public void setUp() throws Exception {
54 userTransaction = mock(UserTransaction.class);
55 StubInitialContextFactory.register();
56 InitialContext ctx = new InitialContext();
57 ctx.bind("java:comp/UserTransaction", userTransaction);
58 BEHAVIOR = mock(Runnable.class);
59 wicket = new WicketTester(new WebApplication() {
62 public Class<? extends Page> getHomePage() {
66 public RequestCycle newRequestCycle(Request aRequest,
68 return new OpenTransactionInViewRequestCycle(this,
69 (WebRequest) aRequest, aResponse);
76 public void tearDown() {
77 StubInitialContextFactory.unregister();
80 private void stubTransactionBehavior(final int aStatus) throws Exception {
81 when(userTransaction.getStatus()).thenReturn(aStatus);
82 doAnswer(new Answer() {
84 public Object answer(InvocationOnMock aInvocation) throws Throwable {
85 when(userTransaction.getStatus()).thenReturn(
86 Status.STATUS_ROLLING_BACK);
89 }).when(userTransaction).rollback();
94 public void testCommittedTransaction() throws Exception {
96 stubTransactionBehavior(Status.STATUS_ACTIVE);
98 wicket.startPage(MyPage.class);
99 wicket.assertRenderedPage(MyPage.class);
101 InOrder inorder = inOrder(userTransaction);
102 inorder.verify(userTransaction).begin();
103 inorder.verify(userTransaction).commit();
104 verify(userTransaction, never()).rollback();
108 public void testRolledbackTransaction() throws Exception {
109 stubTransactionBehavior(Status.STATUS_ACTIVE);
110 doThrow(new RuntimeException("Page rendering fails")).when(BEHAVIOR)
113 wicket.startPage(MyPage.class);
115 } catch (WicketRuntimeException e) {
116 InOrder inorder = inOrder(userTransaction);
117 inorder.verify(userTransaction).begin();
118 inorder.verify(userTransaction).rollback();
119 verify(userTransaction, never()).commit();
124 public void testMarkTransactionForRollback() throws Exception {
125 stubTransactionBehavior(Status.STATUS_MARKED_ROLLBACK);
126 wicket.startPage(MyPage.class);
127 InOrder inorder = inOrder(userTransaction);
128 inorder.verify(userTransaction).begin();
129 inorder.verify(userTransaction).rollback();
130 verify(userTransaction, never()).commit();