Skip to content

Commit

Permalink
Merge pull request #684 from praekeltfoundation/delete_saved_data
Browse files Browse the repository at this point in the history
fix delete saved data
  • Loading branch information
Hlamallama authored Sep 12, 2023
2 parents 6400f36 + a29c6c3 commit fbd68e3
Show file tree
Hide file tree
Showing 2 changed files with 141 additions and 93 deletions.
30 changes: 24 additions & 6 deletions yal/optout.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,14 +190,32 @@ async def state_delete_saved(self):

update_rp_fields_dict = dict.fromkeys(rp_field_keys, "")
combined_update_dict = fields_to_update_and_retain | update_rp_fields_dict

old_details = self._get_user_details(self.user.metadata)

error = await rapidpro.update_profile(
whatsapp_id, combined_update_dict, self.user.metadata
)
if error:
return await self.go_to_state("state_error")
batch_size = 100
items = list(combined_update_dict.items())
batches = []

sorted_fields = sorted(items)

sorted_field_dict = {}
for key, value in sorted_fields:
sorted_field_dict[key] = value

# splitting combined dictionary into batches off 100
# RapidPro can only update 100 fields at a time
for i in range(0, len(sorted_field_dict), batch_size):
batch = list(sorted_field_dict.items())[i : i + batch_size] # noqa
batches.append(batch)

for batch in batches:
batch_dict = dict(batch)

error = await rapidpro.update_profile(
whatsapp_id, batch_dict, self.user.metadata
)
if error:
return await self.go_to_state("state_error")

question = self._(
"\n".join(
Expand Down
204 changes: 117 additions & 87 deletions yal/tests/test_optout.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,78 +94,90 @@ def update_contact(request):
@app.route("/api/v2/fields.json", methods=["GET"])
def get_instance_fields(request):
tstate.requests.append(request)

results = [
{
"key": "second_phase2_send",
"label": "second phase2 send",
"value_type": "text",
"pinned": False,
},
{
"key": "assessment_reminder_name",
"label": "Assessment Reminder Name",
"value_type": "text",
"pinned": False,
},
{
"key": "total_push_msgs_received",
"label": "total push msgs received",
"value_type": "numeric",
"pinned": False,
},
{
"key": "push_msg_intro_completed",
"label": "push msg intro completed",
"value_type": "text",
"pinned": False,
},
{
"key": "last_topic_sent",
"label": "Last Topic Sent",
"value_type": "text",
"pinned": False,
},
{
"key": "test_template_id",
"label": "Test Template ID",
"value_type": "text",
"pinned": False,
},
{
"key": "assessment_reminder_type",
"label": "Assessment Reminder Type",
"value_type": "text",
"pinned": False,
},
{
"key": "second_phase2_send",
"label": "second phase2 send",
"value_type": "text",
"pinned": False,
},
{
"key": "assessment_reminder_name",
"label": "Assessment Reminder Name",
"value_type": "text",
"pinned": False,
},
{
"key": "phase2_invite_failed",
"label": "phase2 invite failed",
"value_type": "text",
"pinned": False,
},
{
"key": "sent_phase2_invite",
"label": "sent phase2 invite",
"value_type": "text",
"pinned": False,
},
]

for i in range(90):
field = {
"key": f"field_{i}",
"label": f"field {i}",
"value_type": "text",
"pinned": False,
}
results.append(field)

return response.json(
{
"next": None,
"previous": None,
"results": [
{
"key": "second_phase2_send",
"label": "second phase2 send",
"value_type": "text",
"pinned": False,
},
{
"key": "assessment_reminder_name",
"label": "Assessment Reminder Name",
"value_type": "text",
"pinned": False,
},
{
"key": "total_push_msgs_received",
"label": "total push msgs received",
"value_type": "numeric",
"pinned": False,
},
{
"key": "push_msg_intro_completed",
"label": "push msg intro completed",
"value_type": "text",
"pinned": False,
},
{
"key": "last_topic_sent",
"label": "Last Topic Sent",
"value_type": "text",
"pinned": False,
},
{
"key": "test_template_id",
"label": "Test Template ID",
"value_type": "text",
"pinned": False,
},
{
"key": "assessment_reminder_type",
"label": "Assessment Reminder Type",
"value_type": "text",
"pinned": False,
},
{
"key": "second_phase2_send",
"label": "second phase2 send",
"value_type": "text",
"pinned": False,
},
{
"key": "assessment_reminder_name",
"label": "Assessment Reminder Name",
"value_type": "text",
"pinned": False,
},
{
"key": "phase2_invite_failed",
"label": "phase2 invite failed",
"value_type": "text",
"pinned": False,
},
{
"key": "sent_phase2_invite",
"label": "sent phase2 invite",
"value_type": "text",
"pinned": False,
},
],
"results": results,
},
status=200,
)
Expand Down Expand Up @@ -305,32 +317,50 @@ async def test_state_optout_delete_saved(
await tester.user_input("2")
tester.assert_state("state_delete_saved")

# Three API calls:
# Get profile to get old details, get all instance fields, update profile
assert len(rapidpro_mock.tstate.requests) == 3
# Four API calls:
# Get profile to get old details, get all instance fields, update profile twice
# because the fields to be updated are more than 100
assert len(rapidpro_mock.tstate.requests) == 4
expected_paths = [
"/api/v2/contacts.json",
"/api/v2/fields.json",
"/api/v2/contacts.json",
"/api/v2/contacts.json",
]
assert expected_paths == [r.path for r in rapidpro_mock.tstate.requests]
post_request = rapidpro_mock.tstate.requests[2]
post_request_one = rapidpro_mock.tstate.requests[2]
post_request_two = rapidpro_mock.tstate.requests[3]

results = {}
for i in range(90):
results[f"field_{i}"] = ""

fields = {
"assessment_reminder_name": "",
"assessment_reminder_type": "",
"last_topic_sent": "",
"opted_out": "True",
"opted_out_timestamp": "2022-06-19T17:30:00",
"phase2_invite_failed": "",
"push_msg_intro_completed": "",
"push_message_opt_in": "False",
"second_phase2_send": "",
"sent_phase2_invite": "",
}

assert json.loads(post_request.body.decode("utf-8")) == {
"fields": {
"assessment_reminder_name": "",
"assessment_reminder_type": "",
"last_topic_sent": "",
"opted_out": "True",
"opted_out_timestamp": "2022-06-19T17:30:00",
"phase2_invite_failed": "",
"push_msg_intro_completed": "",
"push_message_opt_in": "False",
"second_phase2_send": "",
"sent_phase2_invite": "",
"test_template_id": "",
"total_push_msgs_received": "",
},
fields = fields | results

assert json.loads(post_request_one.body.decode("utf-8")) == {
"fields": fields,
}

fields = {
"test_template_id": "",
"total_push_msgs_received": "",
}

assert json.loads(post_request_two.body.decode("utf-8")) == {
"fields": fields,
}
tester.assert_message(
"\n".join(
Expand Down

0 comments on commit fbd68e3

Please sign in to comment.