Skip to content

Commit 5924bb3

Browse files
authored
Merge pull request #1280 from grails/saveFromListener
Added test in the gorm-tck to verify that the state is saved from the listener
2 parents 0b8f49c + aeb1a60 commit 5924bb3

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package grails.gorm.tests
2+
3+
import grails.gorm.annotation.Entity
4+
import org.grails.datastore.gorm.GormEntity
5+
import org.grails.datastore.gorm.events.ConfigurableApplicationEventPublisher
6+
import org.grails.datastore.mapping.core.Datastore
7+
import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent
8+
import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener
9+
import org.grails.datastore.mapping.engine.event.PreInsertEvent
10+
import org.grails.datastore.mapping.engine.event.PreUpdateEvent
11+
import org.springframework.context.ApplicationEvent
12+
import org.springframework.context.ApplicationEventPublisher
13+
import org.springframework.context.ConfigurableApplicationContext
14+
import spock.util.concurrent.PollingConditions
15+
16+
class DirtyCheckingAfterListenerSpec extends GormDatastoreSpec {
17+
18+
TestSaveOrUpdateEventListener listener
19+
def datastore
20+
21+
@Override
22+
List getDomainClasses() {
23+
return [Player]
24+
}
25+
26+
def setup() {
27+
datastore = session.datastore
28+
listener = new TestSaveOrUpdateEventListener(datastore)
29+
ApplicationEventPublisher publisher = datastore.applicationEventPublisher
30+
if (publisher instanceof ConfigurableApplicationEventPublisher) {
31+
((ConfigurableApplicationEventPublisher) publisher).addApplicationListener(listener)
32+
} else if (publisher instanceof ConfigurableApplicationContext) {
33+
((ConfigurableApplicationContext) publisher).addApplicationListener(listener)
34+
}
35+
}
36+
37+
void "test state change from listener update the object"() {
38+
39+
when:
40+
Player john = new Player(name: "John").save()
41+
42+
then:
43+
new PollingConditions().eventually { listener.isExecuted && Player.count()}
44+
45+
when:
46+
session.flush()
47+
session.clear()
48+
john = Player.get(john.id)
49+
50+
then:
51+
john.attributes
52+
john.attributes.size() == 3
53+
54+
}
55+
}
56+
57+
@Entity
58+
class Player implements GormEntity<Player> {
59+
String name
60+
List<String> attributes
61+
62+
}
63+
64+
class TestSaveOrUpdateEventListener extends AbstractPersistenceEventListener {
65+
66+
boolean isExecuted = false
67+
68+
TestSaveOrUpdateEventListener(Datastore datastore) {
69+
super(datastore)
70+
}
71+
72+
@Override
73+
protected void onPersistenceEvent(AbstractPersistenceEvent event) {
74+
Player player = (Player) event.entityObject
75+
player.attributes = ["test0", "test1", "test2"]
76+
isExecuted = true
77+
}
78+
79+
@Override
80+
boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
81+
return eventType == PreUpdateEvent || eventType == PreInsertEvent
82+
}
83+
}

0 commit comments

Comments
 (0)