0

I'm learning grails and read Grails In Action book. Try perform some tests from it, but got strange behaviour for me. I have next simple integration test:

@Test
public void testProjections() throws Exception {
    User user1 = new User(mail: 'test1@test.tld', password: 'password1').save(flush: true)
    User user2 = new User(mail: 'test2@test.tld', password: 'password2').save(flush: true)
    assertNotNull(user1)
    assertNotNull(user2)
    // Chain add Tag to Post
    user1.addToPosts(new Post(content: 'First').addToTags(new Tag(name: 'tag-0')))
    // Separate add tag to post
    Post post = user1.posts.iterator().next()
    Tag tag1 = new Tag(name: 'tag-1')
    post.addToTags(tag1)

    // http://stackoverflow.com/questions/6288991/do-i-ever-need-to-explicitly-flush-gorm-save-calls-in-grails
    // Have tried with and without next line without success:
    //sessionFactory.getCurrentSession().flush()

    assertEquals(['tag-0', 'tag-1'], user1.posts.iterator().next().tags*.name.sort()) // line 154
…
}

Then I run it twice subsequently:

grails> 
grails> test-app -rerun -integration 
| Running 5 integration tests... 2 of 5
| Failure:  testProjections(com.tariffus.QueryIntegrationTests)
|  java.lang.AssertionError: expected:<[tag-0, tag-1]> but was:<[tag-1]>
    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:743)
    at org.junit.Assert.assertEquals(Assert.java:118)
    at org.junit.Assert.assertEquals(Assert.java:144)
    at com.tariffus.QueryIntegrationTests.testProjections(QueryIntegrationTests.groovy:154)
| Completed 5 integration tests, 1 failed in 0m 0s
| Tests FAILED  - view reports in /home/pasha/Projects/grails/com.tariffus/target/test-reports
grails> 
grails> test-app -rerun -integration 
| Running 5 integration tests... 2 of 5
| Failure:  testProjections(com.tariffus.QueryIntegrationTests)
|  java.lang.AssertionError: expected:<[3, 1, 2]> but was:<[[tag-1, tag-2, tag-0, tag-5, tag-3, tag-4], [tag-6]]>
    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:743)
    at org.junit.Assert.assertEquals(Assert.java:118)
    at org.junit.Assert.assertEquals(Assert.java:144)
    at com.tariffus.QueryIntegrationTests.testProjections(QueryIntegrationTests.groovy:164)
| Completed 5 integration tests, 1 failed in 0m 0s
| Tests FAILED  - view reports in /home/pasha/Projects/grails/com.tariffus/target/test-reports
grails> 

As you can see first fails on line 157 and second, runned just after that in second without any modification goes further.

I use Postgres database and environment test configured dataSource in mode dbCreate = 'update'.

What I do incorrect and why it works sometimes?

Hubbitus
  • 5,161
  • 3
  • 41
  • 47

1 Answers1

0

I would say that a source of problem is this line:

user1.addToPosts(new Post(content: 'First').addToTags(new Tag(name: 'tag-0')))

These dynamic addTo* methods does not propagate save to the associated instances until save() is called on the parent instance. So calling save() on user1 after should fix it:

user1.addToPosts(new Post(content: 'First').addToTags(new Tag(name: 'tag-0')))
user1.save()

This should propagate save() to Post instance at first and then to Tag instance transitively.

lukelazarovic
  • 1,510
  • 11
  • 19
  • Even user1.save(flush: true) does not help. I still get: | java.lang.AssertionError: expected:<[tag-0, tag-1]> but was:<[tag-1]>. – Hubbitus Mar 30 '14 at 16:51