import pytest
import tempfile
import os
from apexbase import ApexClient
class TestDeleteOperations:
@pytest.fixture
def client_with_data(self):
tmpdir = tempfile.mkdtemp()
client = ApexClient(os.path.join(tmpdir, 'test_delete'))
client.create_table("default")
client.store([
{'name': 'Alice', 'age': 25, 'status': 'active'},
{'name': 'Bob', 'age': 35, 'status': 'active'},
{'name': 'Charlie', 'age': 45, 'status': 'inactive'},
{'name': 'David', 'age': 30, 'status': 'inactive'},
{'name': 'Eve', 'age': 28, 'status': 'active'},
])
yield client
client.close()
import shutil
shutil.rmtree(tmpdir, ignore_errors=True)
def test_delete_by_single_id(self, client_with_data):
client = client_with_data
initial_count = client.count_rows()
result = client.delete(id=1)
assert result == True
assert client.count_rows() == initial_count - 1
def test_delete_by_multiple_ids(self, client_with_data):
client = client_with_data
initial_count = client.count_rows()
result = client.delete(id=[1, 2, 3])
assert result == True
assert client.count_rows() == initial_count - 3
def test_delete_by_where_clause(self, client_with_data):
client = client_with_data
deleted_count = client.delete(where="age > 30")
assert deleted_count == 2 assert client.count_rows() == 3
def test_delete_by_where_string_comparison(self, client_with_data):
client = client_with_data
deleted_count = client.delete(where="status = 'inactive'")
assert deleted_count == 2 assert client.count_rows() == 3
def test_delete_by_where_complex_condition(self, client_with_data):
client = client_with_data
deleted_count = client.delete(where="status = 'active' AND age < 30")
assert deleted_count == 2 assert client.count_rows() == 3
def test_delete_no_args_raises_error(self, client_with_data):
client = client_with_data
initial_count = client.count_rows()
with pytest.raises(ValueError) as excinfo:
client.delete()
assert "requires at least one argument" in str(excinfo.value)
assert "'id' or 'where'" in str(excinfo.value)
assert client.count_rows() == initial_count
def test_delete_all_explicit(self, client_with_data):
client = client_with_data
initial_count = client.count_rows()
assert initial_count > 0
deleted_count = client.delete(where="1=1")
assert deleted_count == initial_count
assert client.count_rows() == 0
def test_delete_nonexistent_id(self, client_with_data):
client = client_with_data
initial_count = client.count_rows()
result = client.delete(id=99999)
assert result == False
assert client.count_rows() == initial_count
def test_delete_where_no_match(self, client_with_data):
client = client_with_data
initial_count = client.count_rows()
deleted_count = client.delete(where="age > 100")
assert deleted_count == 0
assert client.count_rows() == initial_count
def test_delete_where_between(self, client_with_data):
client = client_with_data
deleted_count = client.delete(where="age BETWEEN 30 AND 40")
assert deleted_count == 2 assert client.count_rows() == 3
def test_delete_invalid_id_type_raises_error(self, client_with_data):
client = client_with_data
with pytest.raises(ValueError) as excinfo:
client.delete(id="invalid")
assert "int or a list of ints" in str(excinfo.value)
class TestDeleteEdgeCases:
@pytest.fixture
def empty_client(self):
tmpdir = tempfile.mkdtemp()
client = ApexClient(os.path.join(tmpdir, 'test_empty'))
client.create_table("default")
yield client
client.close()
import shutil
shutil.rmtree(tmpdir, ignore_errors=True)
def test_delete_from_empty_table(self, empty_client):
client = empty_client
deleted_count = client.delete(where="1=1")
assert deleted_count == 0
def test_delete_empty_id_list(self):
tmpdir = tempfile.mkdtemp()
try:
client = ApexClient(os.path.join(tmpdir, 'test'))
client.create_table("default")
client.store([{'name': 'test'}])
result = client.delete(id=[])
assert result == True
assert client.count_rows() == 1
client.close()
finally:
import shutil
shutil.rmtree(tmpdir, ignore_errors=True)