You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
4.2 KiB
64 lines
4.2 KiB
package com.mydreamjob.job;
|
|
|
|
import com.mydreamjob.config.MySql57MigrationConfiguration;
|
|
import org.flywaydb.core.Flyway;
|
|
import org.junit.jupiter.api.Test;
|
|
import org.testcontainers.containers.MySQLContainer;
|
|
import java.sql.*;
|
|
import java.util.*;
|
|
import static org.junit.jupiter.api.Assertions.*;
|
|
|
|
/** 独立 V59→V60:真实 MySQL 两版本,旧地址保留、六列、精度、历史 checksum 和幂等。 */
|
|
class JobMapLocationMySqlMigrationTest {
|
|
@Test void mysql57V59ToV60() throws Exception { verify("mysql:5.7.36"); }
|
|
@Test void mysql8V59ToV60() throws Exception { verify("mysql:8.4"); }
|
|
|
|
private Flyway flyway(MySQLContainer<?> db,String version) {
|
|
var config=Flyway.configure().dataSource(db.getJdbcUrl(),db.getUsername(),db.getPassword())
|
|
.locations("classpath:db/migration").target(version);
|
|
MySql57MigrationConfiguration.configure(config);
|
|
return config.load();
|
|
}
|
|
private void verify(String image) throws Exception {
|
|
try(var db=new MySQLContainer<>(image).withDatabaseName("job_map_migration")
|
|
.withUsername("maptest").withPassword("synthetic-test-only")
|
|
.withUrlParam("characterEncoding","UTF-8")
|
|
.withCreateContainerCmdModifier(c->c.getHostConfig().withMemory(768L*1024*1024))) {
|
|
db.start();
|
|
try(var c=DriverManager.getConnection(db.getJdbcUrl(),db.getUsername(),db.getPassword());var s=c.createStatement()) {
|
|
s.execute("ALTER DATABASE job_map_migration CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
|
flyway(db,"59").migrate();
|
|
List<String> history=history(s);
|
|
s.execute("INSERT INTO users(id,phone,role,is_active,is_verified) VALUES(930001,'19900889999','COMPANY',1,1)");
|
|
s.execute("INSERT INTO companies(id,owner_user_id,name,verified) VALUES(930001,930001,'位置迁移测试企业',1)");
|
|
s.execute("INSERT INTO jobs(id,company_id,title,description,city,employment_type,status,work_location) "
|
|
+"VALUES(930001,930001,'迁移测试岗位','合成数据','北京','FULL_TIME','DRAFT','旧工作地址')");
|
|
assertEquals(1,flyway(db,"60").migrate().migrationsExecuted);
|
|
assertEquals(history,history(s));
|
|
try(var r=s.executeQuery("SELECT work_location,map_location_status,map_longitude,map_latitude,map_poi_name FROM jobs WHERE id=930001")) {
|
|
assertTrue(r.next());assertEquals("旧工作地址",r.getString(1));assertEquals("UNSET",r.getString(2));
|
|
assertNull(r.getBigDecimal(3));assertNull(r.getBigDecimal(4));assertNull(r.getString(5));
|
|
}
|
|
try(var r=s.executeQuery("SELECT count(*) FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='jobs' "
|
|
+"AND column_name IN ('map_longitude','map_latitude','map_coordinate_system','map_location_status','map_poi_id','map_poi_name')")) {
|
|
assertTrue(r.next());assertEquals(6,r.getInt(1));
|
|
}
|
|
s.executeUpdate("UPDATE jobs SET map_longitude=116.397463,map_latitude=39.909187,map_coordinate_system='GCJ02',"
|
|
+"map_location_status='CONFIRMED',map_poi_id='test-poi',map_poi_name='公开地标' WHERE id=930001");
|
|
try(var r=s.executeQuery("SELECT map_longitude,map_latitude FROM jobs WHERE id=930001")) {
|
|
assertTrue(r.next());assertEquals("116.397463",r.getBigDecimal(1).toPlainString());
|
|
assertEquals("39.909187",r.getBigDecimal(2).toPlainString());
|
|
}
|
|
assertEquals(0,flyway(db,"60").migrate().migrationsExecuted);flyway(db,"60").validate();
|
|
assertEquals(history,history(s));
|
|
}
|
|
}
|
|
}
|
|
private List<String> history(Statement s) throws SQLException {
|
|
var rows=new ArrayList<String>();
|
|
try(var r=s.executeQuery("SELECT version,checksum,success FROM flyway_schema_history WHERE version<>'60' ORDER BY installed_rank")) {
|
|
while(r.next())rows.add(r.getString(1)+"|"+r.getString(2)+"|"+r.getBoolean(3));
|
|
}
|
|
return rows;
|
|
}
|
|
}
|
|
|