1 package com.atlassian.activeobjects.external;
2
3 import com.atlassian.activeobjects.tx.Transactional;
4 import com.atlassian.sal.api.transaction.TransactionCallback;
5 import org.junit.After;
6 import org.junit.Before;
7 import org.junit.Test;
8 import org.junit.runner.RunWith;
9 import org.mockito.Mock;
10 import org.mockito.junit.MockitoJUnitRunner;
11
12 import static org.junit.Assert.assertNotSame;
13 import static org.junit.Assert.assertSame;
14 import static org.mockito.ArgumentMatchers.any;
15 import static org.mockito.Mockito.when;
16
17
18
19
20 @RunWith(MockitoJUnitRunner.class)
21 public class TransactionalAnnotationProcessorTest {
22 private TransactionalAnnotationProcessor transactionalAnnotationProcessor;
23
24 @Mock
25 @SuppressWarnings("unused")
26 private ActiveObjects ao;
27
28 @Before
29 public void setUp() {
30 transactionalAnnotationProcessor = new TransactionalAnnotationProcessor(ao);
31 }
32
33 @After
34 public void tearDown() {
35 transactionalAnnotationProcessor = null;
36 }
37
38 @Test
39 public void testPostProcessAfterInitializationDoesNothingWhenNotAnnotated() {
40 final Object o = new Object();
41 assertSame(o, transactionalAnnotationProcessor.postProcessAfterInitialization(o, "a-bean-name"));
42 }
43
44 @Test
45 public void testPostProcessAfterInitializationReturnsProxyWhenAnnotatedAtClassLevel() {
46 final Object o = new AnnotatedInterface() {
47 };
48 final Object proxy = transactionalAnnotationProcessor.postProcessAfterInitialization(o, "a-bean-name");
49 assertNotSame(o, proxy);
50 }
51
52 @Test
53 public void testPostProcessAfterInitializationReturnsProxyWhenAnnotatedAtMethodLevel() {
54 final Object o = (AnnotatedMethodInInterface) () -> {};
55 final Object proxy = transactionalAnnotationProcessor.postProcessAfterInitialization(o, "a-bean-name");
56 assertNotSame(o, proxy);
57 }
58
59 @Test
60 public void throwingExceptionInTransactionalMethodActuallyThrowsSameException() {
61 when(ao.executeInTransaction(any())).thenAnswer(invocation ->
62 ((TransactionCallback) invocation.getArgument(0)).doInTransaction());
63
64 final RuntimeException expectedException = new RuntimeException();
65 final Object o = (AnnotatedMethodInInterface) () -> {
66 throw expectedException;
67 };
68
69 final AnnotatedMethodInInterface proxy = (AnnotatedMethodInInterface) transactionalAnnotationProcessor.postProcessAfterInitialization(o, "a-bean-name");
70 assertNotSame(o, proxy);
71 try {
72 proxy.doSomething();
73 } catch (Exception actualException) {
74 assertSame(expectedException, actualException);
75 }
76 }
77
78 @Transactional
79 public interface AnnotatedInterface {
80 }
81
82 public interface AnnotatedMethodInInterface {
83 @Transactional
84 @SuppressWarnings("unused")
85 void doSomething();
86 }
87 }