Skip to content
This repository
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 116 lines (98 sloc) 3.421 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
/*
* Copyright 2009-2011 WorldWide Conferencing, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package net.liftweb
package mapper

import org.specs.Specification

/**
* Systems under specification for ManyToMany.
*/
object ManyToManySpec extends Specification("ManyToMany Specification") {

  val provider = DbProviders.H2MemoryProvider
  
  private def ignoreLogger(f: => AnyRef): Unit = ()
  def setupDB {
    MapperRules.createForeignKeys_? = c => false
    provider.setupDB
    Schemifier.destroyTables_!!(ignoreLogger _, PersonCompany, Company, Person)
    Schemifier.schemify(true, ignoreLogger _, Person, Company, PersonCompany)
  }
  def createPerson = {
    val person = new Person
    person.save
    val companies = (1 to 10).toList map { i =>
      val c = new Company
      c.name ()= i.toString
      c.save
      c
    }
    person.companies ++= companies
    person.save
    // Break some joins
    companies(3).delete_! // delete "4"
    companies(6).delete_! // delete "7"
    person.companies.refresh // reload joins so joinEntity.company.obj isn't cached
    person
  }

  "ManyToMany" should {
    "skip broken joins in children" in {
      setupDB
      val person = createPerson
      person.companies.joins.length must_== 10
      person.companies.all.length must_== 8
    }
    "handle missing joins in insertAll" in {
      setupDB
      val person = createPerson
      val c = new Company
      c.name ()= "new"
      c.save
      person.companies.insertAll(7, Seq(c))
      person.companies(7).name.is must_== "new"
    }


// from Florian

    "count unsaved children" in {
      setupDB
      val person = new Person
      val company = new Company
      person.companies += company
      person.companies.length must_== 1
    }
    "count saved children" in {
      setupDB
      val person = new Person
      val company = new Company
      company.save
      person.companies += company
      person.companies.length must_== 1
    }
  }

}



class Person extends LongKeyedMapper[Person] with IdPK with ManyToMany {
  def getSingleton = Person
  object companies extends MappedManyToMany(PersonCompany, PersonCompany.person, PersonCompany.company, Company)
}
object Person extends Person with LongKeyedMetaMapper[Person]

class Company extends LongKeyedMapper[Company] with IdPK {
  def getSingleton = Company
  object name extends MappedString(this, 10)
}
object Company extends Company with LongKeyedMetaMapper[Company]

class PersonCompany extends Mapper[PersonCompany] {
  def getSingleton = PersonCompany
  object person extends MappedLongForeignKey(this, Person)
  object company extends MappedLongForeignKey(this, Company)

  override def toString = "PersonCompany(person.is=%s, person.obj=%s, company.is=%s, company.obj=%s)".format(person.is,person.obj,company.is,company.obj)
}
object PersonCompany extends PersonCompany with MetaMapper[PersonCompany]

Something went wrong with that request. Please try again.