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.
55 lines
4.8 KiB
55 lines
4.8 KiB
package com.mydreamjob.application;
|
|
|
|
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 static org.junit.jupiter.api.Assertions.*;
|
|
|
|
/** 真实 MySQL 5.7/8:V57 原数据升级、生成占位、唯一约束和旧关联保留。 */
|
|
class ApplicationReapplicationMigrationTest {
|
|
@Test void mysql57Upgrade() throws Exception { verify("mysql:5.7.36"); }
|
|
@Test void mysql8Upgrade() throws Exception { verify("mysql:8.4"); }
|
|
Flyway flyway(String url,String user,String pass,String target) {
|
|
var config=Flyway.configure().dataSource(url,user,pass).locations("classpath:db/migration");
|
|
if(target!=null) config.target(target);
|
|
MySql57MigrationConfiguration.configure(config);
|
|
return config.load();
|
|
}
|
|
void verify(String image) throws Exception {
|
|
try(var mysql=new MySQLContainer<>(image).withDatabaseName("qsp_reapply_migration")
|
|
.withUsername("reapply").withPassword("isolated-only")
|
|
.withCreateContainerCmdModifier(cmd->cmd.getHostConfig().withMemory(768L*1024*1024))) {
|
|
mysql.start();String base=mysql.getJdbcUrl();
|
|
String url=base+(base.contains("?")?"&":"?")+"characterEncoding=UTF-8";
|
|
try(var c=DriverManager.getConnection(url,mysql.getUsername(),mysql.getPassword());var s=c.createStatement()) {
|
|
s.execute("ALTER DATABASE qsp_reapply_migration CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
|
|
flyway(url,mysql.getUsername(),mysql.getPassword(),"57").migrate();
|
|
s.execute("INSERT INTO users(id,phone,role,is_active,is_verified) VALUES(990001,'19908000001','COMPANY',1,1),(990002,'19908000002','STUDENT',1,1)");
|
|
s.execute("INSERT INTO companies(id,owner_user_id,name,verified) VALUES(990001,990001,'synthetic migration',1)");
|
|
s.execute("INSERT INTO jobs(id,company_id,title,description,city,employment_type,status) VALUES(990001,990001,'synthetic','test','test','FULL_TIME','PUBLISHED'),(990002,990001,'blocked','test','test','FULL_TIME','PUBLISHED')");
|
|
s.execute("INSERT INTO applications(id,job_id,student_user_id,status) VALUES(990001,990001,990002,'WITHDRAWN'),(990002,990002,990002,'REJECTED')");
|
|
s.execute("INSERT INTO application_status_history(application_id,operator_user_id,from_status,to_status) VALUES(990001,990002,'SUBMITTED','WITHDRAWN')");
|
|
s.execute("INSERT INTO application_match_records(application_id,job_id,company_id,candidate_id,status) VALUES(990001,990001,990001,990002,'MATCHED')");
|
|
assertEquals(1,flyway(url,mysql.getUsername(),mysql.getPassword(),"58").migrate().migrationsExecuted);
|
|
assertEquals("WITHDRAWN",scalar(s,"SELECT status FROM applications WHERE id=990001"));
|
|
assertEquals("1",scalar(s,"SELECT attempt_number FROM applications WHERE id=990001"));
|
|
assertNull(scalar(s,"SELECT active_application_key FROM applications WHERE id=990001"));
|
|
assertEquals("1",scalar(s,"SELECT active_application_key FROM applications WHERE id=990002"));
|
|
assertEquals("MATCHED",scalar(s,"SELECT status FROM application_match_records WHERE application_id=990001"));
|
|
assertEquals("1",scalar(s,"SELECT COUNT(*) FROM application_status_history WHERE application_id=990001"));
|
|
s.execute("INSERT INTO applications(id,job_id,student_user_id,status,attempt_number,previous_application_id) VALUES(990003,990001,990002,'SUBMITTED',2,990001)");
|
|
assertThrows(SQLException.class,()->s.execute("INSERT INTO applications(job_id,student_user_id,status,attempt_number) VALUES(990001,990002,'SUBMITTED',3)"));
|
|
assertThrows(SQLException.class,()->s.execute("INSERT INTO applications(job_id,student_user_id,status,attempt_number) VALUES(990002,990002,'SUBMITTED',2)"));
|
|
s.execute("UPDATE applications SET status='WITHDRAWN' WHERE id=990003");
|
|
s.execute("INSERT INTO applications(job_id,student_user_id,status,attempt_number,previous_application_id) VALUES(990001,990002,'SUBMITTED',3,990003)");
|
|
assertThrows(SQLException.class,()->s.execute("INSERT INTO applications(job_id,student_user_id,status,attempt_number) VALUES(990001,990002,'WITHDRAWN',2)"));
|
|
assertEquals("3",scalar(s,"SELECT COUNT(*) FROM applications WHERE job_id=990001"));
|
|
flyway(url,mysql.getUsername(),mysql.getPassword(),"58").validate();
|
|
assertEquals(0,flyway(url,mysql.getUsername(),mysql.getPassword(),"58").migrate().migrationsExecuted);
|
|
}
|
|
}
|
|
}
|
|
String scalar(Statement s,String sql) throws SQLException {try(var r=s.executeQuery(sql)){assertTrue(r.next());return r.getString(1);}}
|
|
}
|
|
|