Skip to content

Commit

Permalink
MockAirtable.set_records
Browse files Browse the repository at this point in the history
  • Loading branch information
mesozoic committed Sep 17, 2024
1 parent 753c8e9 commit 3fd154e
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 21 deletions.
40 changes: 40 additions & 0 deletions pyairtable/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,46 @@ def add_records(self, *args: Any, **kwargs: Any) -> List[RecordDict]:
)
return coerced

@overload
def set_records(
self,
base_id: str,
table_id_or_name: str,
/,
records: Iterable[Dict[str, Any]],
) -> None: ...

@overload
def set_records(
self,
table: Table,
/,
records: Iterable[Dict[str, Any]],
) -> None: ...

def set_records(self, *args: Any, **kwargs: Any) -> None:
"""
Set the mock records for a particular base and table, replacing any existing records.
See :meth:`~MockAirtable.add_records` for more information.
Args:
base_id: |arg_base_id|
*This must be the first positional argument.*
table_id_or_name: |arg_table_id_or_name|
This should be the same ID or name used in the code under test.
*This must be the second positional argument.*
table: An instance of :class:`~pyairtable.Table`.
*This is an alternative to providing base and table IDs,
and must be the first positional argument.*
records: A sequence of :class:`~pyairtable.api.types.RecordDict`,
:class:`~pyairtable.api.types.UpdateRecordDict`,
:class:`~pyairtable.api.types.CreateRecordDict`,
or :class:`~pyairtable.api.types.Fields`.
"""
base_id, table_name, records = _extract_args(args, kwargs, ["records"])
self.records[(base_id, table_name)].clear()
self.add_records(base_id, table_name, records=records)

def clear(self) -> None:
"""
Clear all records from the mock Airtable instance.
Expand Down
69 changes: 48 additions & 21 deletions tests/test_testing__mock_airtable.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,6 @@ def mock_airtable(requests_mock):
yield m


@pytest.fixture
def mock_records(mock_airtable, table):
mock_records = [T.fake_record() for _ in range(5)]
mock_airtable.add_records(table, mock_records)
return mock_records


@pytest.fixture
def mock_record(mock_records):
return mock_records[0]


def test_not_reentrant():
"""
Test that nested MockAirtable contexts raise an error.
Expand All @@ -44,19 +32,22 @@ def test_multiple_nested_contexts():
pass


def test_add_records__ids(mock_airtable, mock_records, table):
mock_airtable.add_records(table.base.id, table.name, mock_records)
assert table.all() == mock_records
def test_add_records__ids(mock_airtable, table):
fake_records = [T.fake_record() for _ in range(3)]
mock_airtable.add_records(table.base.id, table.name, fake_records)
assert table.all() == fake_records


def test_add_records__ids_kwarg(mock_airtable, mock_records, table):
mock_airtable.add_records(table.base.id, table.name, records=mock_records)
assert table.all() == mock_records
def test_add_records__ids_kwarg(mock_airtable, table):
fake_records = [T.fake_record() for _ in range(3)]
mock_airtable.add_records(table.base.id, table.name, records=fake_records)
assert table.all() == fake_records


def test_add_records__kwarg(mock_airtable, mock_records, table):
mock_airtable.add_records(table, records=mock_records)
assert table.all() == mock_records
def test_add_records__kwarg(mock_airtable, table):
fake_records = [T.fake_record() for _ in range(3)]
mock_airtable.add_records(table, records=fake_records)
assert table.all() == fake_records


def test_add_records__missing_kwarg(mock_airtable, table):
Expand All @@ -82,6 +73,42 @@ def test_add_records__invalid_kwarg(mock_airtable, table):
mock_airtable.add_records(table, records=[], asdf=1)


@pytest.fixture
def mock_records(mock_airtable, table):
mock_records = [T.fake_record() for _ in range(5)]
mock_airtable.add_records(table, mock_records)
return mock_records


@pytest.fixture
def mock_record(mock_records):
return mock_records[0]


def test_set_records(mock_airtable, mock_records, table):
replace = [T.fake_record()]
mock_airtable.set_records(table, replace)
assert table.all() == replace


def test_set_records__ids(mock_airtable, mock_records, table):
replace = [T.fake_record()]
mock_airtable.set_records(table.base.id, table.name, replace)
assert table.all() == replace


def test_set_records__ids_kwarg(mock_airtable, mock_records, table):
replace = [T.fake_record()]
mock_airtable.set_records(table.base.id, table.name, records=replace)
assert table.all() == replace


def test_set_records__kwarg(mock_airtable, mock_records, table):
replace = [T.fake_record()]
mock_airtable.set_records(table, records=replace)
assert table.all() == replace


@pytest.mark.parametrize(
"funcname,expected",
[
Expand Down

0 comments on commit 3fd154e

Please sign in to comment.