(no commit message)
[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     private static Runnable BEHAVIOR;
47     
48     public static Runnable getBEHAVIOR() {
49         return BEHAVIOR;
50     }
51
52     @Before
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() {
60
61             @Override
62             public Class<? extends Page> getHomePage() {
63                 return MyPage.class;
64             }
65
66             public RequestCycle newRequestCycle(Request aRequest,
67                 Response aResponse) {
68                 return new OpenTransactionInViewRequestCycle(this,
69                     (WebRequest) aRequest, aResponse);
70             }
71         });
72
73     }
74
75     @After
76     public void tearDown() {
77         StubInitialContextFactory.unregister();
78     }
79
80     private void stubTransactionBehavior(final int aStatus) throws Exception {
81         when(userTransaction.getStatus()).thenReturn(aStatus);
82         doAnswer(new Answer() {
83             @Override
84             public Object answer(InvocationOnMock aInvocation) throws Throwable {
85                 when(userTransaction.getStatus()).thenReturn(
86                     Status.STATUS_ROLLING_BACK);
87                 return null;
88             }
89         }).when(userTransaction).rollback();
90
91     }
92
93     @Test
94     public void testCommittedTransaction() throws Exception {
95
96         stubTransactionBehavior(Status.STATUS_ACTIVE);
97
98         wicket.startPage(MyPage.class);
99         wicket.assertRenderedPage(MyPage.class);
100
101         InOrder inorder = inOrder(userTransaction);
102         inorder.verify(userTransaction).begin();
103         inorder.verify(userTransaction).commit();
104         verify(userTransaction, never()).rollback();
105     }
106
107     @Test
108     public void testRolledbackTransaction() throws Exception {
109         stubTransactionBehavior(Status.STATUS_ACTIVE);
110         doThrow(new RuntimeException("Page rendering fails")).when(BEHAVIOR)
111             .run();
112         try {
113             wicket.startPage(MyPage.class);
114             fail();
115         } catch (WicketRuntimeException e) {
116             InOrder inorder = inOrder(userTransaction);
117             inorder.verify(userTransaction).begin();
118             inorder.verify(userTransaction).rollback();
119             verify(userTransaction, never()).commit();
120         }
121     }
122
123     @Test
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();
131     }
132
133 }