/
DbmDiffCommandSpec.groovy
134 lines (112 loc) · 4.49 KB
/
DbmDiffCommandSpec.groovy
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
* Copyright 2015 original authors
*
* 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 org.grails.plugins.databasemigration.command
import grails.dev.commands.ApplicationCommand
import groovy.sql.Sql
import org.grails.plugins.databasemigration.DatabaseMigrationException
import org.h2.Driver
import org.springframework.jdbc.datasource.DriverManagerDataSource
import spock.lang.AutoCleanup
import java.sql.Connection
class DbmDiffCommandSpec extends ApplicationContextDatabaseMigrationCommandSpec {
final Class<ApplicationCommand> commandClass = DbmDiffCommand
@AutoCleanup
Connection otherDbConnection
@AutoCleanup
Sql otherDbSql
def setup() {
def otherDbDataSource = new DriverManagerDataSource('jdbc:h2:mem:otherDb', 'sa', '')
otherDbDataSource.driverClassName = Driver.name
otherDbConnection = otherDbDataSource.connection
otherDbSql = new Sql(otherDbConnection)
otherDbSql.executeUpdate '''
CREATE TABLE book (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(255) NOT NULL, CONSTRAINT PK_BOOK PRIMARY KEY (id))
'''
sql.executeUpdate '''
CREATE TABLE book (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(255) NOT NULL, price INT NOT NULL, CONSTRAINT PK_BOOK PRIMARY KEY (id));
CREATE TABLE author (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, CONSTRAINT PK_AUTHOR PRIMARY KEY (id));
'''
}
def "writes Change Log to update the database to STDOUT"() {
when:
command.handle(getExecutionContext('other'))
then:
String expected = extractOutput(outputCapture)
expected =~ '''
databaseChangeLog = \\{
changeSet\\(author: ".+?", id: ".+?"\\) \\{
createTable\\(tableName: "AUTHOR"\\) \\{
column\\(autoIncrement: "true", name: "ID", type: "INT"\\) \\{
constraints\\(nullable:"false", primaryKey: "true", primaryKeyName: "PK_AUTHOR"\\)
\\}
column\\(name: "NAME", type: "VARCHAR\\(255\\)"\\) \\{
constraints\\(nullable: "false"\\)
\\}
\\}
\\}
changeSet\\(author: ".+?", id: ".+?"\\) \\{
addColumn\\(tableName: "BOOK"\\) \\{
column\\(name: "PRICE", type: "INTEGER"\\) \\{
constraints\\(nullable: "false"\\)
\\}
\\}
\\}
\\}
'''.replaceAll(/\s/,"")
}
def "writes Change Log to update the database to a file given as arguments"() {
given:
def outputChangeLog = new File(changeLogLocation, 'diff.groovy')
when:
command.handle(getExecutionContext('other', outputChangeLog.name))
then:
outputChangeLog.text?.replaceAll(/\s/,"") =~ '''
databaseChangeLog = \\{
changeSet\\(author: ".+?", id: ".+?"\\) \\{
createTable\\(tableName: "AUTHOR"\\) \\{
column\\(autoIncrement: "true", name: "ID", type: "INT"\\) \\{
constraints\\(nullable:"false", primaryKey: "true", primaryKeyName: "PK_AUTHOR"\\)
\\}
column\\(name: "NAME", type: "VARCHAR\\(255\\)"\\) \\{
constraints\\(nullable: "false"\\)
\\}
\\}
\\}
changeSet\\(author: ".+?", id: ".+?"\\) \\{
addColumn\\(tableName: "BOOK"\\) \\{
column\\(name: "PRICE", type: "INTEGER"\\) \\{
constraints\\(nullable: "false"\\)
\\}
\\}
\\}
\\}
'''.replaceAll(/\s/,"")
}
def "an error occurs if the otherEnv parameter is not specified"() {
when:
command.handle(getExecutionContext())
then:
def e = thrown(DatabaseMigrationException)
e.message == 'You must specify the environment to diff against'
}
def "an error occurs if other environment and current environment is same"() {
when:
command.handle(getExecutionContext('test'))
then:
def e = thrown(DatabaseMigrationException)
e.message == 'You must specify a different environment than the one the command is running in'
}
}