ca9ede10965609b6f821d82aed29d11f61d604ad
[utils] / wicket / joe / src / test / java / org / wamblee / wicket / transactions / OpenTransactionInViewRequestCycleTest.java
1 /*
2  * Copyright 2005-2010 the original author or authors.
3  * 
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
7  * 
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  * 
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.
15  */
16 package org.wamblee.wicket.transactions;
17
18 import static junit.framework.Assert.*;
19 import static org.mockito.Mockito.*;
20
21 import javax.naming.InitialContext;
22 import javax.transaction.Status;
23 import javax.transaction.UserTransaction;
24
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;
40
41 public class OpenTransactionInViewRequestCycleTest {
42
43     private UserTransaction userTransaction;
44     private WicketTester wicket;
45
46     public static Runnable BEHAVIOR;
47
48     @Before
49     public void setUp() throws Exception {
50         userTransaction = mock(UserTransaction.class);
51         StubInitialContextFactory.register();
52         InitialContext ctx = new InitialContext();
53         ctx.bind("java:comp/UserTransaction", userTransaction);
54         BEHAVIOR = mock(Runnable.class);
55         wicket = new WicketTester(new WebApplication() {
56
57             @Override
58             public Class<? extends Page> getHomePage() {
59                 return MyPage.class;
60             }
61
62             public RequestCycle newRequestCycle(Request aRequest,
63                 Response aResponse) {
64                 return new OpenTransactionInViewRequestCycle(this,
65                     (WebRequest) aRequest, aResponse);
66             }
67         });
68
69     }
70
71     @After
72     public void tearDown() {
73         StubInitialContextFactory.unregister();
74     }
75
76     private void stubTransactionBehavior(final int aStatus) throws Exception {
77         when(userTransaction.getStatus()).thenReturn(aStatus);
78         doAnswer(new Answer() {
79             @Override
80             public Object answer(InvocationOnMock aInvocation) throws Throwable {
81                 when(userTransaction.getStatus()).thenReturn(
82                     Status.STATUS_ROLLING_BACK);
83                 return null;
84             }
85         }).when(userTransaction).rollback();
86
87     }
88
89     @Test
90     public void testCommittedTransaction() throws Exception {
91
92         stubTransactionBehavior(Status.STATUS_ACTIVE);
93
94         wicket.startPage(MyPage.class);
95         wicket.assertRenderedPage(MyPage.class);
96
97         InOrder inorder = inOrder(userTransaction);
98         inorder.verify(userTransaction).begin();
99         inorder.verify(userTransaction).commit();
100         verify(userTransaction, never()).rollback();
101     }
102
103     @Test
104     public void testRolledbackTransaction() throws Exception {
105         stubTransactionBehavior(Status.STATUS_ACTIVE);
106         doThrow(new RuntimeException("Page rendering fails")).when(BEHAVIOR)
107             .run();
108         try {
109             wicket.startPage(MyPage.class);
110             fail();
111         } catch (WicketRuntimeException e) {
112             InOrder inorder = inOrder(userTransaction);
113             inorder.verify(userTransaction).begin();
114             inorder.verify(userTransaction).rollback();
115             verify(userTransaction, never()).commit();
116         }
117     }
118
119     @Test
120     public void testMarkTransactionForRollback() throws Exception {
121         stubTransactionBehavior(Status.STATUS_MARKED_ROLLBACK);
122         wicket.startPage(MyPage.class);
123         InOrder inorder = inOrder(userTransaction);
124         inorder.verify(userTransaction).begin();
125         inorder.verify(userTransaction).rollback();
126         verify(userTransaction, never()).commit();
127     }
128
129 }