package jnpf.elnMapper; import jnpf.elnEntity.formula.ElnFormulaDefEntity; import jnpf.elnEntity.formula.ElnFormulaParameterSlotEntity; import jnpf.elnEntity.formula.ElnFormulaVersionEntity; import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Update; import org.junit.Test; import java.lang.reflect.Method; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class ElnFormulaMapperContractTest { @Test public void definitionUpdateUsesTenantIdAndOptimisticVersion() throws Exception { String sql = updateSql(ElnFormulaDefMapper.class, "updateMutableByTenantAndVersion", ElnFormulaDefEntity.class); assertTenantIdVersionGuard(sql); assertTrue(sql.contains("gongshi_mingcheng =")); assertTrue(sql.contains("f_version = f_version + 1")); assertFalse(sql.contains("gongshi_bianma =")); assertFalse(setClause(sql).contains("f_tenant_id =")); } @Test public void versionUpdateUsesTenantIdAndOptimisticVersion() throws Exception { String sql = updateSql(ElnFormulaVersionMapper.class, "updateMutableByTenantAndVersion", ElnFormulaVersionEntity.class); assertTenantIdVersionGuard(sql); assertTrue(sql.contains("biaodashi =")); assertTrue(sql.contains("biz_status =")); assertFalse(sql.contains("gongshi_dingyi_id =")); assertFalse(sql.contains("banben_hao =")); } @Test public void slotUpdateAndDeleteUseTenantIdAndOptimisticVersion() throws Exception { String updateSql = updateSql(ElnFormulaParameterSlotMapper.class, "updateMutableByTenantAndVersion", ElnFormulaParameterSlotEntity.class); assertTenantIdVersionGuard(updateSql); assertTrue(updateSql.contains("canshu_mingcheng =")); assertFalse(updateSql.contains("canshu_bianma =")); assertFalse(updateSql.contains("gongshi_banben_id =")); Method deleteMethod = ElnFormulaParameterSlotMapper.class.getDeclaredMethod( "deleteByTenantAndVersion", ElnFormulaParameterSlotEntity.class, Integer.class); String deleteSql = normalize(String.join(" ", deleteMethod.getAnnotation(Delete.class).value())); assertTenantIdVersionGuard(deleteSql); } @Test public void slotInsertIgnoresOnlyTenantVersionAndParameterCodeConflict() { Method insertMethod = null; for (Method method : ElnFormulaParameterSlotMapper.class.getDeclaredMethods()) { if (method.getAnnotation(Insert.class) != null) { insertMethod = method; break; } } assertTrue(insertMethod != null); String sql = normalize(String.join(" ", insertMethod.getAnnotation(Insert.class).value())); assertTrue(sql.contains("insert into eln_formula_parameter_slot (gongshi_banben_id, " + "canshu_bianma, canshu_mingcheng, shuju_leixing, danwei, shifou_bitian, " + "paixu, f_id, f_tenant_id, f_version, f_creator_user_id, f_creator_time, " + "f_last_modify_user_id, f_last_modify_time, f_delete_user_id, f_delete_time, " + "f_delete_mark) values (")); assertTrue(sql.contains("on conflict (f_tenant_id, gongshi_banben_id, canshu_bianma) " + "do nothing")); } private static String updateSql(Class mapper, String name, Class entity) throws Exception { Method method = mapper.getDeclaredMethod(name, entity, Integer.class); return normalize(String.join(" ", method.getAnnotation(Update.class).value())); } private static void assertTenantIdVersionGuard(String sql) { assertTrue(sql.contains("where f_tenant_id = #{entity.ftenantid}")); assertTrue(sql.contains("and f_id = #{entity.id}")); assertTrue(sql.contains("and f_version = #{expectedversion}")); } private static String normalize(String sql) { return sql.toLowerCase().replaceAll("\\s+", " ").trim(); } private static String setClause(String sql) { return sql.substring(0, sql.indexOf(" where ")); } }