def test_skip_restore_alias(tmpdir, config_writer, django_db_blocker): config_writer(base_dir=BACKUPS_DIR) backup = Backup.prepare_restore( str(tmpdir.join("config.yml")), os.path.join(BACKUPS_DIR, "2018-06-27-daily")) # uses the actual db name, not the test db name with django_db_blocker.unblock(): with connections["default"].cursor() as cursor: cursor.execute("DROP TABLE IF EXISTS django_migrations;") with connections["secondary"].cursor() as cursor: cursor.execute("DROP TABLE IF EXISTS django_migrations;") backup.restore(files=False, skip_db=["secondary"]) with connections["default"].cursor() as cursor: cursor.execute("SELECT COUNT(*) FROM django_migrations;") (count, ) = cursor.fetchone() assert count > 0 with connections["secondary"].cursor() as cursor: sql = """ SELECT EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'django_migrations' ); """ cursor.execute(sql) (exists, ) = cursor.fetchone() assert not exists
def test_restore_folders(settings, tmpdir, config_writer): """ Assert that uploaded file directories can be restored. """ settings.MEDIA_ROOT = str(tmpdir.join("media")) settings.PRIVATE_MEDIA_ROOT = str(tmpdir.join("private_media")) config_writer( base_dir=BACKUPS_DIR, files={"directories": ["MEDIA_ROOT", "PRIVATE_MEDIA_ROOT"]}, ) backup = Backup.prepare_restore( str(tmpdir.join("config.yml")), os.path.join(BACKUPS_DIR, "2018-06-27-daily")) backup.restore(db=False) dirs = {local.basename for local in tmpdir.listdir() if local.isdir()} assert dirs == {"media", "private_media"} media_files = {item.basename for item in tmpdir.join("media").listdir()} assert media_files == {"1"} private_media_files = { item.basename for item in tmpdir.join("private_media").listdir() } assert private_media_files == {"2"}
def test_restore_different_db_name_host_port(tmpdir, config_writer, django_db_blocker, settings): """ Test that the database can be restored into a different database name. The dump archive contains the name of the source database, but there are scenarious where you want to restore into a different database than the source db name. """ config_writer(base_dir=BACKUPS_DIR) backup = Backup.prepare_restore( str(tmpdir.join("config.yml")), os.path.join(BACKUPS_DIR, "2018-06-27-daily")) with django_db_blocker.unblock(): backup.restore( files=False, skip_db=["secondary", "dummy"], db_names={"default": "dummy"}, db_hosts={"default": "otherhost"}, db_ports={"default": "5434"}, ) # check that the db & table is there with connection.cursor() as cursor: cursor.execute("SELECT COUNT(*) FROM django_migrations;") (count, ) = cursor.fetchone() assert count > 0
def test_restore_hard_failure(tmpdir, config_writer, django_db_blocker): config_writer(base_dir=BACKUPS_DIR) backup = Backup.prepare_restore( str(tmpdir.join("config.yml")), os.path.join(BACKUPS_DIR, "2018-06-26-daily"), # doesn't exist ) # uses the actual db name, not the test db name with django_db_blocker.unblock(): with pytest.raises(BackupError): backup.restore(files=False)
def test_backup_skip_db(tmpdir, settings, config_writer): config_writer() backup = Backup.from_config(str(tmpdir.join("config.yml"))) backup.full(db=True, skip_db=["default"], files=False) backup_dir = tmpdir.join("backups").listdir()[0] filenames = [item.basename for item in backup_dir.join("db").listdir()] port = settings.DATABASES["secondary"]["PORT"] assert filenames == ["localhost.{port}.test_ctrlz2.custom".format(port=port)]
def test_backup_no_db(tmpdir, settings, config_writer): settings.MEDIA_ROOT = str(tmpdir.mkdir("media")) tmpdir.join("media", "some_file.txt").write("to check") config_writer() backup = Backup.from_config(str(tmpdir.join("config.yml"))) backup.full(db=False, files=True) backup_dir = tmpdir.join("backups").listdir()[0] media_file = backup_dir.join("files", "media", "some_file.txt") assert media_file.read() == "to check" # expected no database assert backup_dir.join("db").listdir() == []
def test_backup_files_overwrite_target(tmpdir, settings, config_writer): settings.MEDIA_ROOT = str(tmpdir.mkdir("media")) tmpdir.join("media", "some_file.txt").write("to check") config_writer() backup = Backup.from_config(str(tmpdir.join("config.yml"))) media_backup = os.path.join(backup.config.base_dir, "files", "media") os.makedirs(media_backup) with open(os.path.join(media_backup, "other_file.txt"), "w") as _other: _other.write("to overwrite") backup.full(db=False, files=True) backup_dir = tmpdir.join("backups").listdir()[0] assert len(backup_dir.join("files", "media").listdir()) == 1
def test_restore_db(tmpdir, config_writer, django_db_blocker): config_writer(base_dir=BACKUPS_DIR) backup = Backup.prepare_restore( str(tmpdir.join("config.yml")), os.path.join(BACKUPS_DIR, "2018-06-27-daily")) # uses the actual db name, not the test db name with django_db_blocker.unblock(): with connection.cursor() as cursor: cursor.execute("DROP TABLE IF EXISTS django_migrations;") backup.restore(files=False) # check that the table is there with connection.cursor() as cursor: cursor.execute("SELECT COUNT(*) FROM django_migrations;") (count, ) = cursor.fetchone() assert count > 0