Skip to content

Commit 24c1d1d

Browse files
rsommerfeldjb3rndt
andauthored
Feature/UI testing (#367)
* add TCT ui tests and distill mocks into separate class * remove moved mocks from AcceptanceTests * save test artifacts in pipeline * add _builds to path of artifacts * remove '/' and '-' from artifact name * change hash to correct (pipeline) value * add changes in main.yml. again. * Editing Assert messages, created default values, and made expected screenshot test failures for Squeak 5.2 * Using NoTDLibCore now * Added Morphic-Testing-Framework to Telegram Baseline and removing NoTDLibCore again * Changing test phone number for further funny testing * Fixing baseline * revert to test number 1234 and rename parameters of forceScreenshot * change test dc Co-authored-by: Jannis Berndt <[email protected]>
1 parent 4eab55f commit 24c1d1d

39 files changed

+195
-33
lines changed

.github/workflows/main.yml

+5
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,8 @@ jobs:
2828
timeout-minutes: 15
2929
env:
3030
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
31+
- uses: actions/upload-artifact@master
32+
if: ${{ always() }}
33+
with:
34+
name: Test Artifacts (${{ matrix.smalltalk }} (${{ matrix.os }}))
35+
path: /home/runner/.smalltalkCI/_builds/telegramTestResults

packages/BaselineOfTelegramClient.package/BaselineOfTelegramClient.class/instance/baseline..st

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ baseline: spec
1717
package: 'JSON' with: [
1818
spec file: 'JSON-ul.35';
1919
repository: 'https://www.squeaksource.com/JSON'];
20+
baseline: 'MorphicTestingFramework' with: [
21+
spec repository: 'github://hpi-swa-teaching/Morphic-Testing-Framework:master/packages'];
2022
baseline: 'SwaLint' with: [
2123
spec repository: 'github://hpi-swa-teaching/SwaLint:develop/packages'].
2224

@@ -26,7 +28,7 @@ baseline: spec
2628
package: 'TelegramClient-UI' with: [
2729
spec requires: #('libraries')];
2830
package: 'TelegramClient-Tests' with: [
29-
spec requires: #('default' 'SwaLint')].
31+
spec requires: #('default' 'SwaLint' 'MorphicTestingFramework')].
3032
spec
3133
group: 'libraries' with: #('Animations' 'FFI' 'JSON');
3234
group: 'default' with: #('TelegramClient-Core' 'TelegramClient-UI');

packages/BaselineOfTelegramClient.package/BaselineOfTelegramClient.class/methodProperties.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
"class" : {
33
},
44
"instance" : {
5-
"baseline:" : "ct 10/8/2020 01:55",
5+
"baseline:" : "JB 5/24/2021 18:04",
66
"postLoad" : "N.S. 5/14/2020 17:20" } }

packages/TelegramClient-Tests.package/TCTAcceptanceTests.class/instance/testMessageAuthors.st

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ testMessageAuthors
44
| message user chat_id notification |
55
self receivedMessage: nil.
66
chat_id := ((self core chats) first) id.
7-
message := self class mockMessageFrom: chat_id.
7+
message := TCTMocks mockMessageEventFrom: chat_id.
88

99
self core handleEvent: message.
10-
user := self class mockUserWith: (self class mockMessageID asString, chat_id).
10+
user := TCTMocks mockUserWith: (TCTMocks mockMessageID asString, chat_id).
1111
self core handleEvent: user.
1212

1313
notification := TCUNotification newWithMessage: self receivedMessage.
1414

15-
self assert: (self class mockUserFullName = (notification sender fullName)).
15+
self assert: (TCTMocks mockUserFullName = (notification sender fullName)).
1616
self assert: (chat_id = (notification chat id)).
17-
self assert: (self class mockMessageText = (notification message message))
17+
self assert: (TCTMocks mockMessageText = (notification message message))
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
{
22
"class" : {
3-
"mockMessageFrom:" : "pk 5/19/2021 11:45",
4-
"mockMessageID" : "pk 5/19/2021 11:36",
5-
"mockMessageText" : "pk 5/19/2021 11:38",
6-
"mockUserFirstName" : "pk 5/19/2021 11:38",
7-
"mockUserFullName" : "pk 5/19/2021 11:49",
8-
"mockUserID" : "pk 5/19/2021 11:34",
9-
"mockUserLastName" : "pk 5/19/2021 11:38",
10-
"mockUserWith:" : "pk 5/19/2021 11:41",
11-
"mockUsername" : "pk 5/19/2021 11:39" },
3+
},
124
"instance" : {
135
"core" : "pk 5/17/2021 15:28",
146
"core:" : "pk 5/17/2021 19:19",
@@ -18,4 +10,4 @@
1810
"receivedMessage:" : "pk 5/17/2021 19:32",
1911
"setUp" : "pk 5/17/2021 19:19",
2012
"tearDown" : "pk 5/17/2021 15:28",
21-
"testMessageAuthors" : "pk 5/19/2021 11:46" } }
13+
"testMessageAuthors" : "JB 5/24/2021 16:18" } }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Provides a set of hardcoded values and methods to create mock objects
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
chat
2+
mockChatID
3+
4+
^ 1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
message
2+
mockMessage
3+
4+
^ TCCMessage newFromMessageEvent: (self mockMessageJsonFrom: self mockChatID) in: TCCNullChat new from: TCCUser new
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
message
2+
mockMessageEventFrom: aChatId
3+
4+
^ TCCEvent newFromTDLibEvent: (Dictionary newFrom: {
5+
'@type' -> 'updateNewMessage'.
6+
'message' -> (self mockMessageJsonFrom: aChatId).
7+
})
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
accessing
1+
message
22
mockMessageID
33

44
^ 9447669760

packages/TelegramClient-Tests.package/TCTAcceptanceTests.class/class/mockMessageFrom..st packages/TelegramClient-Tests.package/TCTMocks.class/class/mockMessageJsonFrom..st

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
accessing
2-
mockMessageFrom: aChatId
1+
message
2+
mockMessageJsonFrom: aChatId
33

4-
^ TCCEvent newFromTDLibEvent: (Dictionary newFrom: {
5-
'@type' -> 'updateNewMessage'.
6-
'message' -> (Dictionary newFrom: {
4+
^ (Dictionary newFrom: {
75
'@type' -> 'message'.
86
'id' -> self mockMessageID.
97
'chat_id' -> aChatId.
@@ -19,5 +17,4 @@ mockMessageFrom: aChatId
1917
}).
2018
'is_outgoing' -> false.
2119
'date' -> 1621267079
22-
})
23-
})
20+
})
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
accessing
1+
message
22
mockMessageText
33

44
^ 'Hallo'
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
accessing
1+
user
22
mockUserFirstName
33

44
^ 'Test'
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
accessing
1+
user
22
mockUserFullName
33

44
^ self mockUserFirstName , ' ', self mockUserLastName
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
accessing
1+
user
22
mockUserID
33

44
^ 1673511834
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
accessing
1+
user
22
mockUserLastName
33

44
^ 'User'

packages/TelegramClient-Tests.package/TCTAcceptanceTests.class/class/mockUserWith..st packages/TelegramClient-Tests.package/TCTMocks.class/class/mockUserWith..st

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
accessing
1+
user
22
mockUserWith: anExtra
33

44
^ (TCCEvent newFromTDLibEvent: (Dictionary newFrom: {
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
accessing
1+
user
22
mockUsername
33

44
^ 'username'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"class" : {
3+
"mockChatID" : "RS 5/23/2021 17:32",
4+
"mockMessage" : "JB 5/24/2021 17:57",
5+
"mockMessageEventFrom:" : "RS 5/23/2021 17:56",
6+
"mockMessageID" : "pk 5/19/2021 11:36",
7+
"mockMessageJsonFrom:" : "RS 5/23/2021 17:26",
8+
"mockMessageText" : "pk 5/19/2021 11:38",
9+
"mockUserFirstName" : "pk 5/19/2021 11:38",
10+
"mockUserFullName" : "pk 5/19/2021 11:49",
11+
"mockUserID" : "pk 5/19/2021 11:34",
12+
"mockUserLastName" : "pk 5/19/2021 11:38",
13+
"mockUserWith:" : "pk 5/19/2021 11:41",
14+
"mockUsername" : "pk 5/19/2021 11:39" },
15+
"instance" : {
16+
} }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"category" : "TelegramClient-Tests",
3+
"classinstvars" : [
4+
],
5+
"classvars" : [
6+
],
7+
"commentStamp" : "RS 5/23/2021 18:15",
8+
"instvars" : [
9+
],
10+
"name" : "TCTMocks",
11+
"pools" : [
12+
],
13+
"super" : "Object",
14+
"type" : "normal" }

packages/TelegramClient-Tests.package/TCTTestCore.class/instance/loginWithTestData.st

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ loginWithTestData
44
"See https://core.telegram.org/api/auth#test-phone-numbers. Choose random numbers to bypass flood limits."
55
| phoneNumber testX testYYYY |
66

7-
testX := $3. "($1 to: $3) atRandom"
7+
testX := $1. "($1 to: $3) atRandom"
88
testYYYY := '1234'. "((1 to: 4) collect: [:i | ($0 to: $9) atRandom]) join"
99
phoneNumber := '99966' , testX , testYYYY.
1010

packages/TelegramClient-Tests.package/TCTTestCore.class/methodProperties.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
},
44
"instance" : {
55
"initializeHandlers" : "pk 5/17/2021 18:35",
6-
"loginWithTestData" : "TR 5/5/2021 08:57" } }
6+
"loginWithTestData" : "RS 5/26/2021 13:57" } }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Provides helper methods for testing UI features
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
default values
2+
defaultExtent
3+
4+
^ 1200 @ 800
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
default values
2+
defaultScreenshotBackgroundColor
3+
4+
^ Color black
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
default values
2+
defaultScreenshotDepth
3+
4+
^ 32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
default values
2+
defaultTestResultPath
3+
4+
^ 'telegramTestResults'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
asserting
2+
assert: aMorph looksLike: aScreenshotFilename
3+
4+
| screenshotHash morphHash |
5+
6+
screenshotHash := self computeHashOf: (ImageReadWriter formFromFileNamed: aScreenshotFilename).
7+
morphHash := self computeHashOf: (self takeScreenshotOf: aMorph).
8+
9+
"only comparing hashes might lead to false positives"
10+
self assert: screenshotHash equals: morphHash.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
asserting
2+
assertReading: aString in: aSuperMorph
3+
4+
aSuperMorph findDeepSubmorphThat:
5+
[:submorph |
6+
[submorph isKindOf: TextMorph]
7+
and: [submorph visible]
8+
and: [submorph text asString includesSubstring: aString]]
9+
ifAbsent:
10+
[AssertionFailure signal: 'No Text ' , aString , ' found in ' , aSuperMorph class asString]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
asserting
2+
assertSeeing: aMorphClassName in: aSuperMorph
3+
4+
aSuperMorph findDeepSubmorphThat:
5+
[:submorph | submorph isKindOf: aMorphClassName]
6+
ifAbsent:
7+
[AssertionFailure signal: 'No Morph ' , aMorphClassName asString , ' found in ' , aSuperMorph class asString]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
image handling
2+
computeHashOf: aForm
3+
4+
^ aForm bits asByteArray hash
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
failures
2+
expectedFailures
3+
4+
^ Smalltalk version = 'Squeak5.2'
5+
ifTrue: [#(testMessageUI)]
6+
ifFalse: [#()]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
image handling
2+
forceSaveScreenshotOf: aMorph as: aFileName in: aDirName
3+
4+
| imageForm directory |
5+
imageForm := self takeScreenshotOf: aMorph.
6+
directory := FileDirectory default directoryNamed: aDirName.
7+
directory assureExistence.
8+
9+
directory deleteFileNamed: aFileName , '.png'.
10+
imageForm writePNGfileNamed: (directory fullNameFor: aFileName , '.png').
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
image handling
2+
takeScreenshotOf: aMorph
3+
4+
^ aMorph imageForm: self class defaultScreenshotDepth backgroundColor: self class defaultScreenshotBackgroundColor forRectangle: aMorph bounds
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
running
2+
tearDown
3+
4+
self deleteMorphs.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
testing
2+
testMessageUI
3+
4+
| message messageMorph |
5+
message := TCTMocks mockMessage.
6+
messageMorph := TCUMessage newFromTCCMessage: message.
7+
8+
self forceSaveScreenshotOf: messageMorph as: 'testMessageUI' in: self class defaultTestResultPath.
9+
self assert: 134349208 equals: (self computeHashOf: (self takeScreenshotOf: messageMorph)).
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
testing
2+
testNotificationContainsMessage
3+
4+
| contents |
5+
6+
self wantsToTest: (TCUNotification newWithMessage: TCTMocks mockMessage).
7+
contents := self subject findByClass: TextMorph.
8+
self assert: (contents morphs anySatisfy: [:textMorph | textMorph contents asString = TCTMocks mockMessageText]).
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"class" : {
3+
"defaultExtent" : "JB 5/24/2021 16:54",
4+
"defaultScreenshotBackgroundColor" : "JB 5/24/2021 16:21",
5+
"defaultScreenshotDepth" : "JB 5/24/2021 16:20",
6+
"defaultTestResultPath" : "RS 5/23/2021 17:12" },
7+
"instance" : {
8+
"assert:looksLike:" : "JB 5/24/2021 16:17",
9+
"assertReading:in:" : "JB 5/24/2021 16:26",
10+
"assertSeeing:in:" : "JB 5/24/2021 16:25",
11+
"computeHashOf:" : "RS 5/23/2021 16:19",
12+
"expectedFailures" : "JB 5/24/2021 16:13",
13+
"forceSaveScreenshotOf:as:in:" : "RS 5/26/2021 13:29",
14+
"takeScreenshotOf:" : "JB 5/24/2021 16:21",
15+
"tearDown" : "JB 5/24/2021 17:42",
16+
"testMessageUI" : "JB 5/24/2021 17:58",
17+
"testNotificationContainsMessage" : "JB 5/24/2021 17:59" } }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"category" : "TelegramClient-Tests",
3+
"classinstvars" : [
4+
],
5+
"classvars" : [
6+
"Screenshots" ],
7+
"commentStamp" : "RK 5/18/2021 11:36",
8+
"instvars" : [
9+
],
10+
"name" : "TCTUITest",
11+
"pools" : [
12+
],
13+
"super" : "MTFTestCase",
14+
"type" : "normal" }

0 commit comments

Comments
 (0)