mirror of
https://github.com/latentPrion/cppbessot.git
synced 2026-06-23 15:18:37 +00:00
Add migration commands for SQLite; not PGSql
This commit is contained in:
@@ -6,3 +6,4 @@ endif()
|
||||
add_subdirectory(googletest)
|
||||
add_subdirectory(cpp-serdes)
|
||||
add_subdirectory(odb-orm)
|
||||
add_subdirectory(db-actions)
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
function(cppbessot_add_db_action_test test_name script_name)
|
||||
add_test(
|
||||
NAME ${test_name}
|
||||
COMMAND "${CMAKE_COMMAND}"
|
||||
"-DCPPBESSOT_TEST_NAME=${test_name}"
|
||||
"-DCPPBESSOT_TEST_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}"
|
||||
"-DCPPBESSOT_TEST_MODULE_SOURCE_DIR=${PROJECT_SOURCE_DIR}"
|
||||
-P "${CMAKE_CURRENT_SOURCE_DIR}/scripts/${script_name}")
|
||||
endfunction()
|
||||
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_invalid_target invalid_target.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_missing_mapping missing_mapping.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_ambiguous_mapping ambiguous_mapping.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_missing_migrate_with missing_migrate_with.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_missing_migration_dir missing_migration_dir.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_proddev_createfrom_illegal proddev_createfrom_illegal.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_sqlite_createfrom sqlite_createfrom.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_sqlite_invalid_sql sqlite_invalid_sql.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_sqlite_migrate sqlite_migrate.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_sqlite_proddev_stale sqlite_proddev_stale.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_sqlite_proddev_clone sqlite_proddev_clone.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_pgsql_createfrom_mock pgsql_createfrom_mock.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_pgsql_migrate_order pgsql_migrate_order.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_pgsql_stale_abort pgsql_stale_abort.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_backfill_env_no_structural backfill_env_no_structural.cmake)
|
||||
cppbessot_add_db_action_test(cppbessot_db_action_regression regression_targets.cmake)
|
||||
@@ -0,0 +1,244 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
function(cppbessot_test_require_var var_name)
|
||||
if(NOT DEFINED ${var_name} OR "${${var_name}}" STREQUAL "")
|
||||
message(FATAL_ERROR "Missing required test variable `${var_name}`.")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_reset_dir path)
|
||||
file(REMOVE_RECURSE "${path}")
|
||||
file(MAKE_DIRECTORY "${path}")
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_write_file path)
|
||||
get_filename_component(_parent "${path}" DIRECTORY)
|
||||
if(NOT "${_parent}" STREQUAL "")
|
||||
file(MAKE_DIRECTORY "${_parent}")
|
||||
endif()
|
||||
string(JOIN "" _content ${ARGN})
|
||||
file(WRITE "${path}" "${_content}")
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_write_shell_script path)
|
||||
cppbessot_test_write_file("${path}" ${ARGN})
|
||||
execute_process(COMMAND chmod +x "${path}")
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_case_dir out_var)
|
||||
cppbessot_test_require_var(CPPBESSOT_TEST_BINARY_DIR)
|
||||
cppbessot_test_require_var(CPPBESSOT_TEST_NAME)
|
||||
set(_case_dir "${CPPBESSOT_TEST_BINARY_DIR}/cases/${CPPBESSOT_TEST_NAME}")
|
||||
cppbessot_test_reset_dir("${_case_dir}")
|
||||
set(${out_var} "${_case_dir}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_write_project root_dir settings_text)
|
||||
cppbessot_test_require_var(CPPBESSOT_TEST_MODULE_SOURCE_DIR)
|
||||
string(REPLACE "\\" "\\\\" _module_dir "${CPPBESSOT_TEST_MODULE_SOURCE_DIR}")
|
||||
set(_settings_parts "${settings_text}" ${ARGN})
|
||||
set(_post_include_text
|
||||
"cppbessot_add_db_createfrom_target()\n"
|
||||
"cppbessot_add_db_migrate_target()\n")
|
||||
list(LENGTH _settings_parts _settings_len)
|
||||
if(_settings_len GREATER 0)
|
||||
math(EXPR _last_index "${_settings_len} - 1")
|
||||
list(GET _settings_parts "${_last_index}" _last_part)
|
||||
if("${_last_part}" STREQUAL "FULL_ENABLE")
|
||||
list(REMOVE_AT _settings_parts "${_last_index}")
|
||||
set(_post_include_text "cppbessot_enable()\n")
|
||||
endif()
|
||||
endif()
|
||||
string(JOIN "" _settings_text ${_settings_parts})
|
||||
cppbessot_test_write_file(
|
||||
"${root_dir}/CMakeLists.txt"
|
||||
"cmake_minimum_required(VERSION 3.20)\n"
|
||||
"project(cppbessot_db_action_fixture LANGUAGES CXX)\n"
|
||||
"set(CPPBESSOT_WORKDIR \"db\" CACHE STRING \"\")\n"
|
||||
"set(DB_SCHEMA_DIR_TO_GENERATE \"v1.1\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_AUTO_ENABLE OFF CACHE BOOL \"\")\n"
|
||||
"${_settings_text}\n"
|
||||
"include(\"${_module_dir}/cmake/CppBeSSOT.cmake\")\n"
|
||||
"${_post_include_text}")
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_add_schema root_dir schema_dir)
|
||||
cppbessot_test_write_file(
|
||||
"${root_dir}/db/${schema_dir}/openapi/openapi.yaml"
|
||||
"openapi: 3.0.0\n"
|
||||
"info:\n"
|
||||
" title: test-${schema_dir}\n"
|
||||
" version: 1.0.0\n"
|
||||
"paths: {}\n"
|
||||
"components:\n"
|
||||
" schemas:\n"
|
||||
" Agent:\n"
|
||||
" type: object\n"
|
||||
" properties:\n"
|
||||
" id:\n"
|
||||
" type: string\n")
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_add_sql_file path content)
|
||||
cppbessot_test_write_file("${path}" "${content}")
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_configure_project root_dir build_dir result_var stdout_var stderr_var)
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}" -S "${root_dir}" -B "${build_dir}"
|
||||
RESULT_VARIABLE _result
|
||||
OUTPUT_VARIABLE _stdout
|
||||
ERROR_VARIABLE _stderr
|
||||
)
|
||||
set(${result_var} "${_result}" PARENT_SCOPE)
|
||||
set(${stdout_var} "${_stdout}" PARENT_SCOPE)
|
||||
set(${stderr_var} "${_stderr}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_build_target build_dir target_name result_var stdout_var stderr_var)
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}" --build "${build_dir}" --target "${target_name}"
|
||||
RESULT_VARIABLE _result
|
||||
OUTPUT_VARIABLE _stdout
|
||||
ERROR_VARIABLE _stderr
|
||||
)
|
||||
set(${result_var} "${_result}" PARENT_SCOPE)
|
||||
set(${stdout_var} "${_stdout}" PARENT_SCOPE)
|
||||
set(${stderr_var} "${_stderr}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_build_target_dry_run build_dir target_name result_var stdout_var stderr_var)
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}" --build "${build_dir}" --target "${target_name}" -- -n
|
||||
RESULT_VARIABLE _result
|
||||
OUTPUT_VARIABLE _stdout
|
||||
ERROR_VARIABLE _stderr
|
||||
)
|
||||
set(${result_var} "${_result}" PARENT_SCOPE)
|
||||
set(${stdout_var} "${_stdout}" PARENT_SCOPE)
|
||||
set(${stderr_var} "${_stderr}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_assert_success result stderr context)
|
||||
if(NOT "${result}" STREQUAL "0")
|
||||
message(FATAL_ERROR "${context} unexpectedly failed.\n${stderr}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_assert_failure_contains result stderr needle)
|
||||
if("${result}" STREQUAL "0")
|
||||
message(FATAL_ERROR "Expected failure containing `${needle}`, but command succeeded.")
|
||||
endif()
|
||||
string(FIND "${stderr}" "${needle}" _match_index)
|
||||
if(_match_index EQUAL -1)
|
||||
message(FATAL_ERROR "Expected failure containing `${needle}`.\nActual stderr:\n${stderr}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_assert_contains haystack needle context)
|
||||
string(FIND "${haystack}" "${needle}" _match_index)
|
||||
if(_match_index EQUAL -1)
|
||||
message(FATAL_ERROR "${context}: expected to find `${needle}` in:\n${haystack}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_assert_file_exists path)
|
||||
if(NOT EXISTS "${path}")
|
||||
message(FATAL_ERROR "Expected file to exist: ${path}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_set_path_with_tool_dir tool_dir)
|
||||
if(DEFINED ENV{PATH} AND NOT "$ENV{PATH}" STREQUAL "")
|
||||
set(ENV{PATH} "${tool_dir}:$ENV{PATH}")
|
||||
else()
|
||||
set(ENV{PATH} "${tool_dir}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_sqlite_exec db_path sql_text)
|
||||
find_program(_sqlite3 sqlite3 REQUIRED)
|
||||
get_filename_component(_parent "${db_path}" DIRECTORY)
|
||||
if(NOT "${_parent}" STREQUAL "")
|
||||
file(MAKE_DIRECTORY "${_parent}")
|
||||
endif()
|
||||
set(_sql_file "${CMAKE_CURRENT_BINARY_DIR}/cppbessot-test-sqlite-exec.sql")
|
||||
file(WRITE "${_sql_file}" "${sql_text}")
|
||||
string(REPLACE "\"" "\\\"" _sqlite_read_file "${_sql_file}")
|
||||
execute_process(
|
||||
COMMAND "${_sqlite3}" "${db_path}" ".read \"${_sqlite_read_file}\""
|
||||
RESULT_VARIABLE _result
|
||||
ERROR_VARIABLE _stderr
|
||||
)
|
||||
file(REMOVE "${_sql_file}")
|
||||
if(NOT _result EQUAL 0)
|
||||
message(FATAL_ERROR "Failed to execute SQLite SQL.\n${_stderr}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_sqlite_query_scalar out_var db_path query)
|
||||
find_program(_sqlite3 sqlite3 REQUIRED)
|
||||
execute_process(
|
||||
COMMAND "${_sqlite3}" -batch -noheader "${db_path}" "${query}"
|
||||
RESULT_VARIABLE _result
|
||||
OUTPUT_VARIABLE _stdout
|
||||
ERROR_VARIABLE _stderr
|
||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||
)
|
||||
if(NOT _result EQUAL 0)
|
||||
message(FATAL_ERROR "Failed SQLite query.\n${_stderr}")
|
||||
endif()
|
||||
set(${out_var} "${_stdout}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_write_mock_psql path)
|
||||
cppbessot_test_write_shell_script(
|
||||
"${path}"
|
||||
"#!/bin/sh\n"
|
||||
"set -eu\n"
|
||||
"log_file=\"${CPPBESSOT_TEST_LOG}\"\n"
|
||||
"conn=\"$1\"\n"
|
||||
"shift\n"
|
||||
"printf 'conn:%s\\n' \"$conn\" >> \"$log_file\"\n"
|
||||
"if [ \"\${CPPBESSOT_TEST_PSQL_FAIL_SELECT:-0}\" = \"1\" ]\n"
|
||||
"then\n"
|
||||
" if printf '%s ' \"$@\" | grep -F \"SELECT 1\" >/dev/null 2>&1\n"
|
||||
" then\n"
|
||||
" echo 'simulated select failure' >&2\n"
|
||||
" exit 1\n"
|
||||
" fi\n"
|
||||
"fi\n"
|
||||
"if [ \"\${CPPBESSOT_TEST_PSQL_FAIL_ALL:-0}\" = \"1\" ]\n"
|
||||
"then\n"
|
||||
" echo 'simulated psql failure' >&2\n"
|
||||
" exit 1\n"
|
||||
"fi\n"
|
||||
"while [ \"$#\" -gt 0 ]\n"
|
||||
"do\n"
|
||||
" if [ \"$1\" = \"-c\" ]\n"
|
||||
" then\n"
|
||||
" shift\n"
|
||||
" printf 'sqlcmd:%s\\n' \"$1\" >> \"$log_file\"\n"
|
||||
" elif [ \"$1\" = \"-f\" ]\n"
|
||||
" then\n"
|
||||
" shift\n"
|
||||
" printf 'sqlfile:%s\\n' \"$(basename \"$1\")\" >> \"$log_file\"\n"
|
||||
" fi\n"
|
||||
" shift\n"
|
||||
"done\n")
|
||||
endfunction()
|
||||
|
||||
function(cppbessot_test_assert_log_order log_path)
|
||||
file(READ "${log_path}" _contents)
|
||||
set(_cursor -1)
|
||||
foreach(_needle IN LISTS ARGN)
|
||||
string(FIND "${_contents}" "${_needle}" _index)
|
||||
if(_index EQUAL -1)
|
||||
message(FATAL_ERROR "Missing log entry `${_needle}`.\nLog contents:\n${_contents}")
|
||||
endif()
|
||||
if(_index LESS_EQUAL _cursor)
|
||||
message(FATAL_ERROR "Log entry `${_needle}` appeared out of order.\nLog contents:\n${_contents}")
|
||||
endif()
|
||||
set(_cursor "${_index}")
|
||||
endforeach()
|
||||
endfunction()
|
||||
@@ -0,0 +1,15 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(CPPBESSOT_DB_SQLITE_DEV_PATH \"${_case_dir}/live/dev.sqlite\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_PGSQL_DEV_CONNSTR \"dbname=test\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/v1.1/generated-sql-ddl/sqlite/01-schema.sql"
|
||||
"CREATE TABLE sample(id TEXT);\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_createfrom" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_failure_contains("${_build_result}" "${_build_stderr}" "is ambiguous")
|
||||
@@ -0,0 +1,28 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
set(_log_file "${_case_dir}/events.log")
|
||||
cppbessot_test_write_file("${_log_file}" "")
|
||||
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(DB_MIGRATE_WITH \"v1.0-v1.1\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_SQLITE_DEV_PATH \"${_case_dir}/live/dev.sqlite\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_write_shell_script(
|
||||
"${_case_dir}/db/migrations/v1.0-v1.1/pre-structural-backfill.sh"
|
||||
"#!/bin/sh\n"
|
||||
"set -eu\n"
|
||||
"printf 'pre:%s:%s:%s:%s\\n' \"$CPPBESSOT_DB_TARGET\" \"$CPPBESSOT_DB_BACKEND\" \"$CPPBESSOT_DB_MIGRATE_WITH\" \"$CPPBESSOT_DB_SCHEMA_DIR_TO_GENERATE\" >> \"${_log_file}\"\n"
|
||||
"printf 'sqlite:%s\\n' \"$CPPBESSOT_DB_SQLITE_PATH\" >> \"${_log_file}\"\n")
|
||||
cppbessot_test_write_shell_script(
|
||||
"${_case_dir}/db/migrations/v1.0-v1.1/post-structural-backfill.sh"
|
||||
"#!/bin/sh\n"
|
||||
"set -eu\n"
|
||||
"printf 'post:%s\\n' \"$CPPBESSOT_DB_CREATEFROM_SCHEMA_DIR\" >> \"${_log_file}\"\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_migrate" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_success("${_build_result}" "${_build_stderr}" "db_migrate hook-only")
|
||||
cppbessot_test_assert_log_order("${_log_file}" "pre:dev:sqlite:v1.0-v1.1:v1.1" "sqlite:${_case_dir}/live/dev.sqlite" "post:v1.1")
|
||||
@@ -0,0 +1,15 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(DB_TARGET \"bogus\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_SQLITE_DEV_PATH \"${_case_dir}/live/dev.sqlite\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/v1.1/generated-sql-ddl/sqlite/01-schema.sql"
|
||||
"CREATE TABLE sample(id TEXT);\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_createfrom" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_failure_contains("${_build_result}" "${_build_stderr}" "DB_TARGET must be one of")
|
||||
@@ -0,0 +1,12 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
cppbessot_test_write_project("${_case_dir}" "")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/v1.1/generated-sql-ddl/sqlite/01-schema.sql"
|
||||
"CREATE TABLE sample(id TEXT);\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_createfrom" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_failure_contains("${_build_result}" "${_build_stderr}" "is not mapped")
|
||||
@@ -0,0 +1,12 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(CPPBESSOT_DB_SQLITE_DEV_PATH \"${_case_dir}/live/dev.sqlite\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_migrate" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_failure_contains("${_build_result}" "${_build_stderr}" "Required variable `DB_MIGRATE_WITH` is missing")
|
||||
@@ -0,0 +1,13 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(DB_MIGRATE_WITH \"v1.0-v1.1\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_SQLITE_DEV_PATH \"${_case_dir}/live/dev.sqlite\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_migrate" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_failure_contains("${_build_result}" "${_build_stderr}" "Migration directory does not exist")
|
||||
@@ -0,0 +1,31 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
set(_tool_dir "${_case_dir}/tools")
|
||||
set(_log_file "${_case_dir}/psql.log")
|
||||
set(CPPBESSOT_TEST_LOG "${_log_file}")
|
||||
cppbessot_test_write_file("${_log_file}" "")
|
||||
cppbessot_test_write_mock_psql("${_tool_dir}/psql")
|
||||
cppbessot_test_set_path_with_tool_dir("${_tool_dir}")
|
||||
set(ENV{CPPBESSOT_TEST_LOG} "${_log_file}")
|
||||
set(ENV{CPPBESSOT_TEST_PSQL_FAIL_ALL} "0")
|
||||
set(ENV{CPPBESSOT_TEST_PSQL_FAIL_SELECT} "0")
|
||||
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(CPPBESSOT_DB_PGSQL_DEV_CONNSTR \"dbname=dev_db\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/v1.1/generated-sql-ddl/postgre/01-schema.sql"
|
||||
"CREATE TABLE sample(id TEXT PRIMARY KEY);\n")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/v1.1/generated-sql-ddl/postgre/02-seed.sql"
|
||||
"INSERT INTO sample(id) VALUES ('row-1');\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_createfrom" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_success("${_build_result}" "${_build_stderr}" "db_createfrom pgsql mock")
|
||||
|
||||
file(READ "${_log_file}" _log_contents)
|
||||
cppbessot_test_assert_contains("${_log_contents}" "sqlcmd:DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public;" "pgsql reset log")
|
||||
cppbessot_test_assert_contains("${_log_contents}" "sqlfile:01-schema.sql" "pgsql schema log")
|
||||
cppbessot_test_assert_contains("${_log_contents}" "sqlfile:02-seed.sql" "pgsql seed log")
|
||||
@@ -0,0 +1,34 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
set(_tool_dir "${_case_dir}/tools")
|
||||
set(_log_file "${_case_dir}/events.log")
|
||||
set(CPPBESSOT_TEST_LOG "${_log_file}")
|
||||
cppbessot_test_write_file("${_log_file}" "")
|
||||
cppbessot_test_write_mock_psql("${_tool_dir}/psql")
|
||||
cppbessot_test_set_path_with_tool_dir("${_tool_dir}")
|
||||
set(ENV{CPPBESSOT_TEST_LOG} "${_log_file}")
|
||||
set(ENV{CPPBESSOT_TEST_PSQL_FAIL_ALL} "0")
|
||||
set(ENV{CPPBESSOT_TEST_PSQL_FAIL_SELECT} "0")
|
||||
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(DB_TARGET \"proddev\" CACHE STRING \"\")\n"
|
||||
"set(DB_MIGRATE_WITH \"v1.0-v1.1\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_PGSQL_PRODDEV_CONNSTR \"dbname=proddev_db\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_PGSQL_CLONE_PROD_TO_PRODDEV_COMMAND \"printf 'clone\\\\n' >> '${_log_file}'\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_write_shell_script(
|
||||
"${_case_dir}/db/migrations/v1.0-v1.1/pre-structural-backfill.sh"
|
||||
"#!/bin/sh\nset -eu\nprintf 'pre\\n' >> \"$CPPBESSOT_TEST_LOG\"\n")
|
||||
cppbessot_test_write_shell_script(
|
||||
"${_case_dir}/db/migrations/v1.0-v1.1/post-structural-backfill.sh"
|
||||
"#!/bin/sh\nset -eu\nprintf 'post\\n' >> \"$CPPBESSOT_TEST_LOG\"\n")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/migrations/v1.0-v1.1/postgre/01-migrate.sql"
|
||||
"ALTER TABLE sample ADD COLUMN note TEXT;\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_migrate" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_success("${_build_result}" "${_build_stderr}" "db_migrate pgsql order")
|
||||
cppbessot_test_assert_log_order("${_log_file}" "clone" "pre" "sqlfile:01-migrate.sql" "post")
|
||||
@@ -0,0 +1,27 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
set(_tool_dir "${_case_dir}/tools")
|
||||
set(_log_file "${_case_dir}/psql.log")
|
||||
set(CPPBESSOT_TEST_LOG "${_log_file}")
|
||||
cppbessot_test_write_file("${_log_file}" "")
|
||||
cppbessot_test_write_mock_psql("${_tool_dir}/psql")
|
||||
cppbessot_test_set_path_with_tool_dir("${_tool_dir}")
|
||||
set(ENV{CPPBESSOT_TEST_LOG} "${_log_file}")
|
||||
set(ENV{CPPBESSOT_TEST_PSQL_FAIL_SELECT} "1")
|
||||
set(ENV{CPPBESSOT_TEST_PSQL_FAIL_ALL} "0")
|
||||
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(DB_TARGET \"proddev\" CACHE STRING \"\")\n"
|
||||
"set(DB_MIGRATE_WITH \"v1.0-v1.1\" CACHE STRING \"\")\n"
|
||||
"set(DB_MIGRATE_PRODDEV_USE_STALE ON CACHE BOOL \"\")\n"
|
||||
"set(CPPBESSOT_DB_PGSQL_PRODDEV_CONNSTR \"dbname=proddev_db\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/migrations/v1.0-v1.1/postgre/01-migrate.sql"
|
||||
"ALTER TABLE sample ADD COLUMN note TEXT;\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_migrate" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_failure_contains("${_build_result}" "${_build_stderr}" "no current stale proddev target")
|
||||
@@ -0,0 +1,15 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(DB_TARGET \"proddev\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_SQLITE_PRODDEV_PATH \"${_case_dir}/live/proddev.sqlite\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/v1.1/generated-sql-ddl/sqlite/01-schema.sql"
|
||||
"CREATE TABLE sample(id TEXT);\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_createfrom" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_failure_contains("${_build_result}" "${_build_stderr}" "does not support DB_TARGET=proddev")
|
||||
@@ -0,0 +1,25 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_require_var(CPPBESSOT_TEST_BINARY_DIR)
|
||||
cppbessot_test_require_var(CPPBESSOT_TEST_MODULE_SOURCE_DIR)
|
||||
set(_build_dir "${CPPBESSOT_TEST_BINARY_DIR}/regression-build")
|
||||
cppbessot_test_reset_dir("${_build_dir}")
|
||||
get_filename_component(_repo_root "${CPPBESSOT_TEST_MODULE_SOURCE_DIR}/../.." ABSOLUTE)
|
||||
|
||||
execute_process(
|
||||
COMMAND "${CMAKE_COMMAND}"
|
||||
-S "${_repo_root}"
|
||||
-B "${_build_dir}"
|
||||
-DDB_SCHEMA_DIR_TO_GENERATE=v1.1
|
||||
-DDB_SCHEMA_DIR_MIGRATION_FROM=v1.1
|
||||
-DDB_SCHEMA_DIR_MIGRATION_TO=v1.2
|
||||
-DCPPBESSOT_AUTO_ENABLE=ON
|
||||
RESULT_VARIABLE _cfg_result
|
||||
OUTPUT_VARIABLE _cfg_stdout
|
||||
ERROR_VARIABLE _cfg_stderr
|
||||
)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target_dry_run("${_build_dir}" "cppBeSsotOpenAiModelGen" _model_result _model_stdout _model_stderr)
|
||||
cppbessot_test_assert_success("${_model_result}" "${_model_stderr}" "dry-run openai model lib build")
|
||||
cppbessot_test_build_target_dry_run("${_build_dir}" "db_gen_migrations" _mig_result _mig_stdout _mig_stderr)
|
||||
cppbessot_test_assert_success("${_mig_result}" "${_mig_stderr}" "dry-run migration generation build")
|
||||
@@ -0,0 +1,29 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
set(_db_path "${_case_dir}/live/dev.sqlite")
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(CPPBESSOT_DB_SQLITE_DEV_PATH \"${_db_path}\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/v1.1/generated-sql-ddl/sqlite/01-schema.sql"
|
||||
"CREATE TABLE sample(id TEXT PRIMARY KEY, note TEXT);\n")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/v1.1/generated-sql-ddl/sqlite/02-seed.sql"
|
||||
"INSERT INTO sample(id, note) VALUES ('seed-1', 'created-second');\n")
|
||||
cppbessot_test_sqlite_exec("${_db_path}"
|
||||
"CREATE TABLE old_data(id TEXT); INSERT INTO old_data(id) VALUES ('legacy');")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_createfrom" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_success("${_build_result}" "${_build_stderr}" "db_createfrom sqlite")
|
||||
|
||||
cppbessot_test_sqlite_query_scalar(_row_count "${_db_path}" "SELECT COUNT(*) FROM sample;")
|
||||
if(NOT "${_row_count}" STREQUAL "1")
|
||||
message(FATAL_ERROR "Expected seeded sample row after recreate, got `${_row_count}`.")
|
||||
endif()
|
||||
cppbessot_test_sqlite_query_scalar(_old_table_count "${_db_path}"
|
||||
"SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='old_data';")
|
||||
if(NOT "${_old_table_count}" STREQUAL "0")
|
||||
message(FATAL_ERROR "Expected old_data table to be removed during recreate.")
|
||||
endif()
|
||||
@@ -0,0 +1,14 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(CPPBESSOT_DB_SQLITE_DEV_PATH \"${_case_dir}/live/dev.sqlite\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/v1.1/generated-sql-ddl/sqlite/01-schema.sql"
|
||||
"CREATE TABLE sample(id TEXT PRIMARY KEY);\nBROKEN SQL;\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_createfrom" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_failure_contains("${_build_result}" "${_build_stderr}" "SQLite SQL apply failed")
|
||||
@@ -0,0 +1,23 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
set(_db_path "${_case_dir}/live/dev.sqlite")
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(DB_MIGRATE_WITH \"v1.0-v1.1\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_SQLITE_DEV_PATH \"${_db_path}\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_write_file("${_case_dir}/db/migrations/v1.0-v1.1/README.txt" "fixture\n")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/migrations/v1.0-v1.1/sqlite/01-migrate.sql"
|
||||
"ALTER TABLE sample ADD COLUMN note TEXT DEFAULT 'migrated';\n")
|
||||
cppbessot_test_sqlite_exec("${_db_path}"
|
||||
"CREATE TABLE sample(id TEXT PRIMARY KEY); INSERT INTO sample(id) VALUES ('row-1');")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_migrate" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_success("${_build_result}" "${_build_stderr}" "db_migrate sqlite")
|
||||
cppbessot_test_sqlite_query_scalar(_note "${_db_path}" "SELECT note FROM sample WHERE id='row-1';")
|
||||
if(NOT "${_note}" STREQUAL "migrated")
|
||||
message(FATAL_ERROR "Expected migration to add note column with default value, got `${_note}`.")
|
||||
endif()
|
||||
@@ -0,0 +1,28 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
set(_prod_db "${_case_dir}/live/prod.sqlite")
|
||||
set(_proddev_db "${_case_dir}/live/proddev.sqlite")
|
||||
set(_log_file "${_case_dir}/clone.log")
|
||||
cppbessot_test_sqlite_exec("${_prod_db}"
|
||||
"CREATE TABLE sample(id TEXT PRIMARY KEY); INSERT INTO sample(id) VALUES ('prod-row');")
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(DB_TARGET \"proddev\" CACHE STRING \"\")\n"
|
||||
"set(DB_MIGRATE_WITH \"v1.0-v1.1\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_SQLITE_PROD_PATH \"${_prod_db}\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_SQLITE_PRODDEV_PATH \"${_proddev_db}\" CACHE STRING \"\")\n"
|
||||
"set(CPPBESSOT_DB_SQLITE_CLONE_PROD_TO_PRODDEV_COMMAND \"cp '${_prod_db}' '${_proddev_db}' && printf 'clone\\\\n' >> '${_log_file}'\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/migrations/v1.0-v1.1/sqlite/01-migrate.sql"
|
||||
"ALTER TABLE sample ADD COLUMN note TEXT DEFAULT 'cloned';\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_migrate" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_success("${_build_result}" "${_build_stderr}" "db_migrate sqlite proddev clone")
|
||||
cppbessot_test_assert_file_exists("${_proddev_db}")
|
||||
cppbessot_test_sqlite_query_scalar(_note "${_proddev_db}" "SELECT note FROM sample WHERE id='prod-row';")
|
||||
if(NOT "${_note}" STREQUAL "cloned")
|
||||
message(FATAL_ERROR "Expected migrated proddev clone to contain note column, got `${_note}`.")
|
||||
endif()
|
||||
@@ -0,0 +1,18 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/../cmake/TestCommon.cmake")
|
||||
|
||||
cppbessot_test_case_dir(_case_dir)
|
||||
set(_proddev_db "${_case_dir}/live/proddev.sqlite")
|
||||
cppbessot_test_write_project(
|
||||
"${_case_dir}"
|
||||
"set(DB_TARGET \"proddev\" CACHE STRING \"\")\n"
|
||||
"set(DB_MIGRATE_WITH \"v1.0-v1.1\" CACHE STRING \"\")\n"
|
||||
"set(DB_MIGRATE_PRODDEV_USE_STALE ON CACHE BOOL \"\")\n"
|
||||
"set(CPPBESSOT_DB_SQLITE_PRODDEV_PATH \"${_proddev_db}\" CACHE STRING \"\")\n")
|
||||
cppbessot_test_add_schema("${_case_dir}" "v1.1")
|
||||
cppbessot_test_add_sql_file("${_case_dir}/db/migrations/v1.0-v1.1/sqlite/01-migrate.sql"
|
||||
"ALTER TABLE sample ADD COLUMN note TEXT DEFAULT 'ok';\n")
|
||||
|
||||
cppbessot_test_configure_project("${_case_dir}" "${_case_dir}/build" _cfg_result _cfg_stdout _cfg_stderr)
|
||||
cppbessot_test_assert_success("${_cfg_result}" "${_cfg_stderr}" "fixture configure")
|
||||
cppbessot_test_build_target("${_case_dir}/build" "db_migrate" _build_result _build_stdout _build_stderr)
|
||||
cppbessot_test_assert_failure_contains("${_build_result}" "${_build_stderr}" "no current stale proddev target")
|
||||
Reference in New Issue
Block a user