package orm

import (
	. "github.com/onsi/ginkgo"
	. "github.com/onsi/gomega"
)

type JoinTest struct {
	tableName struct{} `sql:"JoinTest,alias:JoinTest"`

	Id int

	HasOne   *HasOne
	HasOneId int

	BelongsTo *BelongsTo
}

type HasOne struct {
	tableName struct{} `sql:"HasOne,alias:HasOne"`

	Id int

	HasOne   *HasOne
	HasOneId int
}

type BelongsTo struct {
	tableName struct{} `sql:"BelongsTo,alias:BelongsTo"`

	Id         int
	JoinTestId int
}

var _ = Describe("Select", func() {
	It("supports has one", func() {
		q := NewQuery(nil, &JoinTest{}).Relation("HasOne.HasOne", nil)

		b, err := selectQuery{q: q}.AppendQuery(nil)
		Expect(err).NotTo(HaveOccurred())
		Expect(string(b)).To(Equal(`SELECT JoinTest."id", JoinTest."has_one_id", "has_one"."id" AS "has_one__id", "has_one"."has_one_id" AS "has_one__has_one_id", "has_one__has_one"."id" AS "has_one__has_one__id", "has_one__has_one"."has_one_id" AS "has_one__has_one__has_one_id" FROM JoinTest AS JoinTest LEFT JOIN HasOne AS "has_one" ON "has_one"."id" = JoinTest."has_one_id" LEFT JOIN HasOne AS "has_one__has_one" ON "has_one__has_one"."id" = "has_one"."has_one_id"`))
	})

	It("supports belongs to", func() {
		q := NewQuery(nil, &JoinTest{}).Relation("BelongsTo", nil)

		b, err := selectQuery{q: q}.AppendQuery(nil)
		Expect(err).NotTo(HaveOccurred())
		Expect(string(b)).To(Equal(`SELECT JoinTest."id", JoinTest."has_one_id", "belongs_to"."id" AS "belongs_to__id", "belongs_to"."join_test_id" AS "belongs_to__join_test_id" FROM JoinTest AS JoinTest LEFT JOIN BelongsTo AS "belongs_to" ON "belongs_to"."join_test_id" = JoinTest."id"`))
	})
})
