Skip to content

Bye line things #839

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 12, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,9 @@ Versioning
----------
This project respects semantic versioning

See http://semver.org/
- See `semver.org <https://semver.org/>`_

However, if a feature that was publicly released is discontinued for business reasons and becomes completely unusable, we will release changes as a patch release.

Version 3.x
-----------
Expand Down
209 changes: 75 additions & 134 deletions tests/test_webhook.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@
from linebot.models import (
MessageEvent, FollowEvent, UnfollowEvent, JoinEvent,
LeaveEvent, PostbackEvent, BeaconEvent, AccountLinkEvent,
MemberJoinedEvent, MemberLeftEvent, ThingsEvent,
MemberJoinedEvent, MemberLeftEvent,
UnknownEvent,
TextMessage, ImageMessage, VideoMessage, AudioMessage,
LocationMessage, StickerMessage, FileMessage,
SourceUser, SourceRoom, SourceGroup,
DeviceLink, DeviceUnlink, ScenarioResult, ActionResult)
)
from linebot.models.delivery_context import DeliveryContext
from linebot.models.events import UnsendEvent, VideoPlayCompleteEvent
from linebot.models.unsend import Unsend
Expand Down Expand Up @@ -70,7 +70,7 @@ def test_parse(self):
events = self.parser.parse(body, 'channel_secret')

# events count
self.assertEqual(len(events), 30)
self.assertEqual(len(events), 27)

# MessageEvent, SourceUser, TextMessage
self.assertIsInstance(events[0], MessageEvent)
Expand Down Expand Up @@ -392,75 +392,75 @@ def test_parse(self):
self.assertEqual(events[18].postback.data, 'action=buyItem&itemId=123123&color=red')
self.assertEqual(events[18].postback.params['datetime'], '2013-04-01T10:00')

# ThingsEvent, SourceUser, link
self.assertIsInstance(events[19], ThingsEvent)
self.assertEqual(events[19].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
self.assertEqual(events[19].type, 'things')
# MemberJoinedEvent
self.assertIsInstance(events[19], MemberJoinedEvent)
self.assertEqual(events[19].reply_token, '0f3779fba3b349968c5d07db31eabf65')
self.assertEqual(events[19].type, 'memberJoined')
self.assertEqual(events[19].mode, 'active')
self.assertEqual(events[19].timestamp, 1462629479859)
self.assertIsInstance(events[19].source, SourceUser)
self.assertEqual(events[19].source.type, 'user')
self.assertEqual(events[19].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertIsInstance(events[19].source, SourceGroup)
self.assertEqual(events[19].source.type, 'group')
self.assertEqual(events[19].source.group_id, 'C4af4980629...')
self.assertEqual(events[19].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[19].delivery_context, DeliveryContext)
self.assertFalse(events[19].delivery_context.is_redelivery)
self.assertIsInstance(events[19].things, DeviceLink)
self.assertEqual(events[19].things.type, 'link')
self.assertEqual(events[19].things.device_id, 't2c449c9d1')
self.assertEqual(len(events[19].joined.members), 2)
self.assertIsInstance(events[19].joined.members[0], SourceUser)
self.assertEqual(events[19].joined.members[0].user_id, 'U4af4980629...')
self.assertEqual(events[19].joined.members[1].user_id, 'U91eeaf62d9...')

# MemberJoinedEvent
self.assertIsInstance(events[20], MemberJoinedEvent)
self.assertEqual(events[20].reply_token, '0f3779fba3b349968c5d07db31eabf65')
self.assertEqual(events[20].type, 'memberJoined')
# MemberLeftEvent
self.assertIsInstance(events[20], MemberLeftEvent)
self.assertEqual(events[20].type, 'memberLeft')
self.assertEqual(events[20].mode, 'active')
self.assertEqual(events[20].timestamp, 1462629479859)
self.assertEqual(events[20].timestamp, 1462629479960)
self.assertIsInstance(events[20].source, SourceGroup)
self.assertEqual(events[20].source.type, 'group')
self.assertEqual(events[20].source.group_id, 'C4af4980629...')
self.assertEqual(events[20].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[20].delivery_context, DeliveryContext)
self.assertFalse(events[20].delivery_context.is_redelivery)
self.assertEqual(len(events[20].joined.members), 2)
self.assertIsInstance(events[20].joined.members[0], SourceUser)
self.assertEqual(events[20].joined.members[0].user_id, 'U4af4980629...')
self.assertEqual(events[20].joined.members[1].user_id, 'U91eeaf62d9...')
self.assertEqual(len(events[20].left.members), 2)
self.assertIsInstance(events[20].left.members[0], SourceUser)
self.assertEqual(events[20].left.members[0].user_id, 'U4af4980629...')
self.assertEqual(events[20].left.members[1].user_id, 'U91eeaf62d9...')

# MemberLeftEvent
self.assertIsInstance(events[21], MemberLeftEvent)
self.assertEqual(events[21].type, 'memberLeft')
# MessageEvent, SourceUser, FileMessage
self.assertIsInstance(events[21], MessageEvent)
self.assertEqual(events[21].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
self.assertEqual(events[21].type, 'message')
self.assertEqual(events[21].mode, 'active')
self.assertEqual(events[21].timestamp, 1462629479960)
self.assertIsInstance(events[21].source, SourceGroup)
self.assertEqual(events[21].source.type, 'group')
self.assertEqual(events[21].source.group_id, 'C4af4980629...')
self.assertEqual(events[21].timestamp, 1462629479859)
self.assertIsInstance(events[21].source, SourceUser)
self.assertEqual(events[21].source.type, 'user')
self.assertEqual(events[21].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertEqual(events[21].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[21].delivery_context, DeliveryContext)
self.assertFalse(events[21].delivery_context.is_redelivery)
self.assertEqual(len(events[21].left.members), 2)
self.assertIsInstance(events[21].left.members[0], SourceUser)
self.assertEqual(events[21].left.members[0].user_id, 'U4af4980629...')
self.assertEqual(events[21].left.members[1].user_id, 'U91eeaf62d9...')

# ThingsEvent, SourceUser, unlink
self.assertIsInstance(events[22], ThingsEvent)
self.assertEqual(events[22].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
self.assertEqual(events[22].type, 'things')
self.assertIsInstance(events[21].message, FileMessage)
self.assertEqual(events[21].message.id, '325708')
self.assertEqual(events[21].message.type, 'file')
self.assertEqual(events[21].message.file_name, "file.txt")
self.assertEqual(events[21].message.file_size, 2138)

# UnsendEvent
self.assertIsInstance(events[22], UnsendEvent)
self.assertEqual(events[22].type, 'unsend')
self.assertEqual(events[22].mode, 'active')
self.assertEqual(events[22].timestamp, 1462629479859)
self.assertIsInstance(events[22].source, SourceUser)
self.assertEqual(events[22].source.type, 'user')
self.assertEqual(events[22].timestamp, 1547817848122)
self.assertIsInstance(events[22].source, SourceGroup)
self.assertEqual(events[22].source.type, 'group')
self.assertEqual(events[22].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertEqual(events[22].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[22].delivery_context, DeliveryContext)
self.assertFalse(events[22].delivery_context.is_redelivery)
self.assertIsInstance(events[22].things, DeviceUnlink)
self.assertEqual(events[22].things.type, 'unlink')
self.assertEqual(events[22].things.device_id, 't2c449c9d1')
self.assertIsInstance(events[22].unsend, Unsend)
self.assertEqual(events[22].unsend.message_id, '325708')

# MessageEvent, SourceUser, FileMessage
self.assertIsInstance(events[23], MessageEvent)
# VideoPlayCompleteEvent
self.assertIsInstance(events[23], VideoPlayCompleteEvent)
self.assertEqual(events[23].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
self.assertEqual(events[23].type, 'message')
self.assertEqual(events[23].type, 'videoPlayComplete')
self.assertEqual(events[23].mode, 'active')
self.assertEqual(events[23].timestamp, 1462629479859)
self.assertIsInstance(events[23].source, SourceUser)
Expand All @@ -469,107 +469,48 @@ def test_parse(self):
self.assertEqual(events[23].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[23].delivery_context, DeliveryContext)
self.assertFalse(events[23].delivery_context.is_redelivery)
self.assertIsInstance(events[23].message, FileMessage)
self.assertEqual(events[23].message.id, '325708')
self.assertEqual(events[23].message.type, 'file')
self.assertEqual(events[23].message.file_name, "file.txt")
self.assertEqual(events[23].message.file_size, 2138)

# ThingsEvent, SourceUser, scenarioResult
self.assertIsInstance(events[24], ThingsEvent)
self.assertEqual(events[24].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
self.assertEqual(events[24].type, 'things')
self.assertIsInstance(events[23].video_play_complete, VideoPlayComplete)
self.assertEqual(events[23].video_play_complete.tracking_id, 'track_id')

# MessageEvent, SourceUser, ImageMessage with ImageSet
self.assertIsInstance(events[1], MessageEvent)
self.assertEqual(events[24].reply_token, 'fbf94e269485410da6b7e3a5e33283e8')
self.assertEqual(events[24].type, 'message')
self.assertEqual(events[24].mode, 'active')
self.assertEqual(events[24].timestamp, 1547817848122)
self.assertEqual(events[24].timestamp, 1627356924722)
self.assertIsInstance(events[24].source, SourceUser)
self.assertEqual(events[24].source.type, 'user')
self.assertEqual(events[24].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertEqual(events[24].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[24].delivery_context, DeliveryContext)
self.assertFalse(events[24].delivery_context.is_redelivery)
self.assertIsInstance(events[24].things, ScenarioResult)
self.assertEqual(events[24].things.type, 'scenarioResult')
self.assertEqual(events[24].things.device_id, 't2c449c9d1')
self.assertEqual(events[24].things.result.scenario_id, 'XXX')
self.assertEqual(events[24].things.result.revision, 2)
self.assertEqual(events[24].things.result.start_time, 1547817845950)
self.assertEqual(events[24].things.result.end_time, 1547817845952)
self.assertEqual(events[24].things.result.result_code, 'success')
self.assertEqual(events[24].things.result.ble_notification_payload, 'AQ==')
self.assertIsInstance(events[24].things.result.action_results[0], ActionResult)
self.assertEqual(events[24].things.result.action_results[0].type, 'binary')
self.assertEqual(events[24].things.result.action_results[0].data, '/w==')
self.assertIsInstance(events[24].things.result.action_results[1], ActionResult)
self.assertEqual(events[24].things.result.action_results[1].type, 'void')
self.assertIsInstance(events[24].message, ImageMessage)
self.assertEqual(events[24].message.id, '354718705033693861')
self.assertEqual(events[24].message.type, 'image')
self.assertEqual(events[24].message.content_provider.type, 'line')
self.assertEqual(events[24].message.image_set.id, 'E005D41A7288F41B655')
self.assertEqual(events[24].message.image_set.index, 2)
self.assertEqual(events[24].message.image_set.total, 2)

# UnsendEvent
self.assertIsInstance(events[25], UnsendEvent)
self.assertEqual(events[25].type, 'unsend')
# MessageEvent, SourceUser, TextMessage (Redeliveried)
self.assertIsInstance(events[25], MessageEvent)
self.assertEqual(events[25].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
self.assertEqual(events[25].type, 'message')
self.assertEqual(events[25].mode, 'active')
self.assertEqual(events[25].timestamp, 1547817848122)
self.assertIsInstance(events[25].source, SourceGroup)
self.assertEqual(events[25].source.type, 'group')
self.assertEqual(events[25].timestamp, 1462629479859)
self.assertIsInstance(events[25].source, SourceUser)
self.assertEqual(events[25].source.type, 'user')
self.assertEqual(events[25].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertEqual(events[25].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[25].delivery_context, DeliveryContext)
self.assertFalse(events[25].delivery_context.is_redelivery)
self.assertIsInstance(events[25].unsend, Unsend)
self.assertEqual(events[25].unsend.message_id, '325708')

# VideoPlayCompleteEvent
self.assertIsInstance(events[26], VideoPlayCompleteEvent)
self.assertEqual(events[26].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
self.assertEqual(events[26].type, 'videoPlayComplete')
self.assertEqual(events[26].mode, 'active')
self.assertEqual(events[26].timestamp, 1462629479859)
self.assertIsInstance(events[26].source, SourceUser)
self.assertEqual(events[26].source.type, 'user')
self.assertEqual(events[26].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertEqual(events[26].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[26].delivery_context, DeliveryContext)
self.assertFalse(events[26].delivery_context.is_redelivery)
self.assertIsInstance(events[26].video_play_complete, VideoPlayComplete)
self.assertEqual(events[26].video_play_complete.tracking_id, 'track_id')

# MessageEvent, SourceUser, ImageMessage with ImageSet
self.assertIsInstance(events[1], MessageEvent)
self.assertEqual(events[27].reply_token, 'fbf94e269485410da6b7e3a5e33283e8')
self.assertEqual(events[27].type, 'message')
self.assertEqual(events[27].mode, 'active')
self.assertEqual(events[27].timestamp, 1627356924722)
self.assertIsInstance(events[27].source, SourceUser)
self.assertEqual(events[27].source.type, 'user')
self.assertEqual(events[27].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertEqual(events[27].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[27].delivery_context, DeliveryContext)
self.assertFalse(events[27].delivery_context.is_redelivery)
self.assertIsInstance(events[27].message, ImageMessage)
self.assertEqual(events[27].message.id, '354718705033693861')
self.assertEqual(events[27].message.type, 'image')
self.assertEqual(events[27].message.content_provider.type, 'line')
self.assertEqual(events[27].message.image_set.id, 'E005D41A7288F41B655')
self.assertEqual(events[27].message.image_set.index, 2)
self.assertEqual(events[27].message.image_set.total, 2)

# MessageEvent, SourceUser, TextMessage (Redeliveried)
self.assertIsInstance(events[28], MessageEvent)
self.assertEqual(events[28].reply_token, 'nHuyWiB7yP5Zw52FIkcQobQuGDXCTA')
self.assertEqual(events[28].type, 'message')
self.assertEqual(events[28].mode, 'active')
self.assertEqual(events[28].timestamp, 1462629479859)
self.assertIsInstance(events[28].source, SourceUser)
self.assertEqual(events[28].source.type, 'user')
self.assertEqual(events[28].source.user_id, 'U206d25c2ea6bd87c17655609a1c37cb8')
self.assertEqual(events[28].webhook_event_id, 'testwebhookeventid')
self.assertIsInstance(events[28].delivery_context, DeliveryContext)
self.assertTrue(events[28].delivery_context.is_redelivery)
self.assertIsInstance(events[28].message, TextMessage)
self.assertEqual(events[28].message.id, '325708')
self.assertEqual(events[28].message.type, 'text')
self.assertEqual(events[28].message.text, 'Hello, world')
self.assertTrue(events[25].delivery_context.is_redelivery)
self.assertIsInstance(events[25].message, TextMessage)
self.assertEqual(events[25].message.id, '325708')
self.assertEqual(events[25].message.type, 'text')
self.assertEqual(events[25].message.text, 'Hello, world')

# UnknownEvent
self.assertIsInstance(events[29], UnknownEvent)
self.assertIsInstance(events[26], UnknownEvent)

def test_parse_webhook_req_without_destination(self):
body = """
Expand Down
71 changes: 0 additions & 71 deletions tests/text/webhook.json
Original file line number Diff line number Diff line change
Expand Up @@ -361,24 +361,6 @@
}
}
},
{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"type": "things",
"mode": "active",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
},
"webhookEventId": "testwebhookeventid",
"deliveryContext": {
"isRedelivery": false
},
"things": {
"deviceId": "t2c449c9d1",
"type": "link"
}
},
{
"replyToken": "0f3779fba3b349968c5d07db31eabf65",
"type": "memberJoined",
Expand Down Expand Up @@ -430,24 +412,6 @@
]
}
},
{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"type": "things",
"mode": "active",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
},
"webhookEventId": "testwebhookeventid",
"deliveryContext": {
"isRedelivery": false
},
"things": {
"deviceId": "t2c449c9d1",
"type": "unlink"
}
},
{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"type": "message",
Expand All @@ -468,41 +432,6 @@
"fileSize": 2138
}
},
{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"type": "things",
"mode": "active",
"source": {
"type": "user",
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
},
"webhookEventId": "testwebhookeventid",
"deliveryContext": {
"isRedelivery": false
},
"timestamp": 1547817848122,
"things": {
"type": "scenarioResult",
"deviceId": "t2c449c9d1",
"result": {
"scenarioId": "XXX",
"revision": 2,
"startTime": 1547817845950,
"endTime": 1547817845952,
"resultCode": "success",
"bleNotificationPayload": "AQ==",
"actionResults": [
{
"type": "binary",
"data": "/w=="
},
{
"type": "void"
}
]
}
}
},
{
"type": "unsend",
"mode": "active",
Expand Down
Loading