1 package org.apache.onami.persist.test;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import com.google.inject.Guice;
23 import com.google.inject.Injector;
24 import com.google.inject.Key;
25 import com.google.inject.Scopes;
26 import org.apache.onami.persist.EntityManagerProvider;
27 import org.apache.onami.persist.PersistenceFilter;
28 import org.apache.onami.persist.PersistenceModule;
29 import org.apache.onami.persist.test.multipersistenceunits.FirstPU;
30 import org.apache.onami.persist.test.multipersistenceunits.SecondPU;
31 import org.junit.After;
32 import org.junit.Before;
33 import org.junit.Test;
34 import org.mockito.invocation.InvocationOnMock;
35 import org.mockito.stubbing.Answer;
36
37 import javax.servlet.FilterChain;
38 import javax.servlet.FilterConfig;
39 import javax.servlet.ServletRequest;
40 import javax.servlet.ServletResponse;
41
42 import static org.hamcrest.CoreMatchers.is;
43 import static org.junit.Assert.assertNotNull;
44 import static org.junit.Assert.assertNull;
45 import static org.junit.Assert.assertThat;
46 import static org.mockito.Mockito.doAnswer;
47 import static org.mockito.Mockito.mock;
48
49
50
51
52 public class PersistenceServletFilterTest
53 {
54 private EntityManagerProvider firstEmp;
55
56 private EntityManagerProvider secondEmp;
57
58 private PersistenceFilter persistenceFilter;
59
60 private Injector injector;
61
62 @Before
63 public final void setUp()
64 throws Exception
65 {
66 final PersistenceModule pm = createPersistenceModuleForTest();
67 injector = Guice.createInjector( pm );
68
69 persistenceFilter = injector.getInstance( Key.get( PersistenceFilter.class ) );
70 persistenceFilter.init( mock( FilterConfig.class ) );
71
72 firstEmp = injector.getInstance( Key.get( EntityManagerProvider.class, FirstPU.class ) );
73 secondEmp = injector.getInstance( Key.get( EntityManagerProvider.class, SecondPU.class ) );
74 }
75
76 private PersistenceModule createPersistenceModuleForTest()
77 {
78 return new PersistenceModule()
79 {
80
81 @Override
82 protected void configurePersistence()
83 {
84 bindApplicationManagedPersistenceUnit( "firstUnit" ).annotatedWith( FirstPU.class );
85 bindApplicationManagedPersistenceUnit( "secondUnit" ).annotatedWith( SecondPU.class );
86 }
87 };
88 }
89
90 @After
91 public final void tearDown()
92 throws Exception
93 {
94 persistenceFilter.destroy();
95 }
96
97
98 @Test
99 public void persistenceFilterShouldBeSingleton()
100 {
101 assertThat( isSingleton( PersistenceFilter.class ), is( true ) );
102 }
103
104 private boolean isSingleton( Class<?> type )
105 {
106 return Scopes.isSingleton( injector.getBinding( type ) );
107 }
108
109 @Test
110 public void shouldFilter()
111 throws Exception
112 {
113
114 final ServletRequest request = mock( ServletRequest.class );
115 final ServletResponse response = mock( ServletResponse.class );
116 final FilterChain filterChain = mock( FilterChain.class );
117 doAnswer( new ServletMock() ).when( filterChain ).doFilter( request, response );
118
119
120 persistenceFilter.doFilter( request, response, filterChain );
121 }
122
123 private class ServletMock
124 implements Answer<Void>
125 {
126
127 public Void answer( InvocationOnMock invocation )
128 throws Throwable
129 {
130
131 final TestEntity firstEntity = new TestEntity();
132 final TestEntity secondEntity = new TestEntity();
133
134
135 firstEmp.get().persist( firstEntity );
136 secondEmp.get().persist( secondEntity );
137
138
139 assertNotNull( firstEmp.get().find( TestEntity.class, firstEntity.getId() ) );
140 assertNotNull( secondEmp.get().find( TestEntity.class, secondEntity.getId() ) );
141 assertNull( firstEmp.get().find( TestEntity.class, secondEntity.getId() ) );
142 assertNull( secondEmp.get().find( TestEntity.class, firstEntity.getId() ) );
143
144 return null;
145 }
146 }
147 }