tags
- expect(comment).to include 'HTML Key | bold | '
- expect(comment).to include '
Link | example.com | '
- expect(comment).to include '
Mixed & Content | Version & Build 1.0 | '
- end
- end
-
- describe 'metadata handling' do
- it 'handles empty metadata gracefully' do
- comment = run_described_fastlane_action(base_params.merge(metadata: {}))
- # Should still include default metadata
- expect(comment).to include 'App Name | '
- expect(comment).to include 'Commit | '
- end
-
- it 'handles nil metadata values' do
- comment = run_described_fastlane_action(base_params.merge(metadata: { 'Nil Value': nil }))
- expect(comment).not_to include 'Nil Value | '
- end
-
- it 'handles very long metadata values' do
- long_value = 'a' * 1000
- comment = run_described_fastlane_action(base_params.merge(metadata: { 'Long Value': long_value }))
- expect(comment).to include long_value
- end
- end
-
describe 'cases common to all operating modes' do
describe 'app_display_name' do
it 'includes the app display name as part of the intro text' do
comment = run_described_fastlane_action(
- app_display_name: 'My Cool App & Co.',
+ app_display_name: 'My Cool App',
download_url: 'https://localhost/foo.apk'
)
- expect(comment).to include '📲 You can test the changes from this Pull Request in My Cool App & Co.'
+ expect(comment).to include '📲 You can test the changes from this Pull Request in My Cool App'
end
it 'includes the app display name as part of implicit metadata' do
comment = run_described_fastlane_action(
- app_display_name: 'My Cool App & Co.',
+ app_display_name: 'My Cool App',
download_url: 'https://localhost/foo.apk'
)
- expect(comment).to include 'App Name | My Cool App & Co. | '
+ expect(comment).to include 'App Name | My Cool App | '
end
end
@@ -119,7 +34,16 @@
app_icon: 'https://localhost/foo.png',
download_url: 'https://localhost/foo.apk'
)
- expect(comment).to include "
📲 "
+ expect(comment).to include "
📲 "
+ end
+
+ it 'includes the icon next to the App Name in metadata' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My Cool App',
+ app_icon: 'https://localhost/foo.png',
+ download_url: 'https://localhost/foo.apk'
+ )
+ expect(comment).to include "App Name | My Cool App | "
end
end
@@ -130,7 +54,16 @@
app_icon: ':jetpack:',
download_url: 'https://localhost/foo.apk'
)
- expect(comment).to include "
📲 "
+ expect(comment).to include "
📲 "
+ end
+
+ it 'includes the icon next to the App Name in metadata' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My Cool App',
+ app_icon: ':jetpack:',
+ download_url: 'https://localhost/foo.apk'
+ )
+ expect(comment).to include "App Name | My Cool App | "
end
end
end
@@ -144,6 +77,7 @@
end
it 'includes the provided footnote if one was provided explicitly' do
+ custom_footnote = 'Note that Google Sign-In in not available in those builds'
comment = run_described_fastlane_action(
app_display_name: 'My App',
download_url: 'https://localhost/foo.apk',
@@ -153,307 +87,489 @@
end
end
- context 'when using Firebase App Distribution' do
- let(:firebase_release_info) do
- {
- displayVersion: '28.7',
- buildVersion: '1287003',
- testingUri: 'https://appdistribution.firebase.google.com/testerapps/1:123456:ios:abcdef/releases/xyz',
- firebaseConsoleUri: 'https://console.firebase.google.com/project/apps-test/appdistribution/app/ios:com.example.myapp/releases/xyz'
- }
+ context 'when using App Center with explicit parameters' do
+ it 'raises an error if neither `app_center_app_name` nor `download_url` is provided' do
+ expect do
+ run_described_fastlane_action(
+ app_display_name: 'My App',
+ app_center_org_name: 'BestOrg'
+ )
+ end.to raise_error(FastlaneCore::Interface::FastlaneError, described_class::NO_INSTALL_URL_ERROR_MESSAGE)
end
- before do
- stub_const('Fastlane::Actions::SharedValues::FIREBASE_APP_DISTRO_RELEASE', :firebase_app_distro_release)
- allow(Fastlane::Actions).to receive(:lane_context).and_return({ firebase_app_distro_release: firebase_release_info })
- end
+ describe 'checking specific content is present' do
+ it 'generates the proper App Center link and QR code given an org, app name and release ID' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My App',
+ app_center_org_name: 'My-Org',
+ app_center_app_name: 'My-App',
+ app_center_release_id: '1337'
+ )
+ expect(comment).to include "My-App #1337"
+ expect(comment).to include 'https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Finstall.appcenter.ms%2Forgs%2FMy-Org%2Fapps%2FMy-App%2Freleases%2F1337'
+ end
- it 'extracts metadata from Firebase release info' do
- comment = run_described_fastlane_action(
- app_display_name: 'My App'
- )
- expect(comment).to include 'Version | 28.7 | '
- expect(comment).to include 'Build Number | 1287003 | '
- expect(comment).to include 'Bundle ID | com.example.myapp | '
- expect(comment).to include 'Installation URL | xyz | '
+ it 'uses the App Center link for the QR code even if a `download_url` is provided' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My App',
+ app_center_org_name: 'My-Org',
+ app_center_app_name: 'My-App',
+ app_center_release_id: '1337',
+ download_url: 'https://foo.cloudfront.net/someuuid/myapp-prototype-build-pr1337-a1b2c3f.apk'
+ )
+ expect(comment).to include "Direct Download | myapp-prototype-build-pr1337-a1b2c3f.apk | "
+ expect(comment).to include 'https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Finstall.appcenter.ms%2Forgs%2FMy-Org%2Fapps%2FMy-App%2Freleases%2F1337'
+ # Inferred metadata rows: App Name, Commit, Direct Download, App Center Build
+ expect(comment).to include "App Name | My App | '
+ expect(comment).to include 'Version:Short | 28.1 | '
+ expect(comment).to include 'Version:Long | 281003 | '
+ expect(comment).to include 'Build Config | Prototype | '
+ expect(comment).to include 'Commit | a1b2c3f | '
+ expect(comment).to include "
App Center Build | My-App #1337 |
"
+ # Additional inferred metadata rows: App Name, Commit, App Center Build
+ expect(comment).to include "Note: Google Sign-In in not available in those builds'
+ )
+
+ expect(comment).to eq <<~EXPECTED_COMMENT
+ 📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
+
+
+  |
+ App Name | The Best App |
+
+ Version:Short | 28.2 |
+ Version:Long | 28.2.0.108 |
+ Flavor | Celray |
+ Commit | a1b2c3f |
+ App Center Build | BestApp #8888 |
+
+ Note: Google Sign-In in not available in those builds
+ EXPECTED_COMMENT
+ end
+
+ it 'generates a HTML table comment including the direct link if provided' do
+ metadata = {
+ 'Version:Short': '28.2',
+ 'Version:Long': '28.2.0.108'
+ }
+
+ comment = run_described_fastlane_action(
+ app_display_name: 'The Best App',
+ app_center_org_name: 'BestOrg',
+ app_center_app_name: 'BestApp',
+ app_center_release_id: '8888',
+ download_url: 'https://bestfront.cloudfront.net/feed42/bestapp-pr1357-a1b2c3f.apk',
+ metadata: metadata
+ )
+
+ expect(comment).to eq <<~EXPECTED_COMMENT
+ 📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
+
+ Automatticians: You can use our internal self-serve MC tool to give yourself access to App Center if needed.
+ EXPECTED_COMMENT
+ end
+
+ it 'generates a HTML table in a spoiler block if fold is true' do
+ metadata = {
+ 'Version:Short': '28.2',
+ 'Version:Long': '28.2.0.108',
+ Flavor: 'Celray',
+ Configuration: 'Debug'
+ }
+
+ comment = run_described_fastlane_action(
+ app_display_name: 'The Best App',
+ app_center_org_name: 'BestOrg',
+ app_center_app_name: 'BestApp',
+ app_center_release_id: '1234',
+ fold: true,
+ metadata: metadata,
+ footnote: 'Note: Google Sign-In in not available in those builds'
+ )
+
+ expect(comment).to eq <<~EXPECTED_COMMENT
+ 📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
+
+
+  |
+ App Name | The Best App |
+
+ Version:Short | 28.2 |
+ Version:Long | 28.2.0.108 |
+ Flavor | Celray |
+ Configuration | Debug |
+ Commit | a1b2c3f |
+ App Center Build | BestApp #1234 |
+
+ Note: Google Sign-In in not available in those builds
+
+ EXPECTED_COMMENT
+ end
end
+ end
- it 'includes and prioritizes user-provided metadata over implicit ones' do
- metadata = {
- Version: '42.3',
- 'Build Number': '4203008',
- 'Build Config': 'Prototype'
- }
- comment = run_described_fastlane_action(
- app_display_name: 'My App',
- metadata: metadata
- )
- expect(comment).to include ' | Version | 42.3 | ' # explicitly provided, overriding the implicit value
- expect(comment).not_to include 'Version | 28.7 | ' # otherwise implicitly added if it were not overridden
- expect(comment).to include 'Build Number | 4203008 | ' # explicitly provided, overriding the implicit value
- expect(comment).not_to include 'Build Number | 1287003 | ' # otherwise implicitly added if it were not overridden
- expect(comment).to include 'Build Config | Prototype | ' # not overriding any implicit one
- # Additional inferred metadata rows: App Name, Bundle ID, Commit, Installation URL
- expect(comment).to include "App Name | My App | '
- expect(comment).to include 'Version:Short | 28.1 | '
- expect(comment).to include 'Version:Long | 281003 | '
- expect(comment).to include 'Build Config | Prototype | '
- expect(comment).to include 'Bundle ID | com.example.myapp | '
- expect(comment).to include 'Commit | a1b2c3f | '
- expect(comment).to include "Installation URL | xyz | "
- # Additional inferred metadata rows: Build Number, Version
- expect(comment).to include "My App (Alpha) #1337"
+ expect(comment).to include 'https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Finstall.appcenter.ms%2Forgs%2FMy-Org%2Fapps%2FMy-App-Alpha%2Freleases%2F1337'
+ end
- it 'uses "Application ID" as the name for the bundle identifier' do
- comment = run_described_fastlane_action(
- app_display_name: 'My App'
- )
- expect(comment).to include ' | Application ID | com.example.myapp | '
- expect(comment).not_to include 'Bundle ID'
- end
+ it 'uses the App Center link for the QR code even if a `download_url` is provided' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My App',
+ app_center_org_name: 'My-Org',
+ download_url: 'https://foo.cloudfront.net/someuuid/myapp-prototype-build-pr1337-a1b2c3f.apk'
+ )
+ expect(comment).to include 'https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Finstall.appcenter.ms%2Forgs%2FMy-Org%2Fapps%2FMy-App-Alpha%2Freleases%2F1337'
+ # Inferred metadata rows: App Name, Build Number, Version, Application ID, Commit, Direct Download, App Center Build
+ expect(comment).to include "Version | 42.3 | ' # explicitly provided, overriding the implicit value
+ expect(comment).not_to include 'Version | 28.7 | ' # otherwise implicitly added if it were not overridden
+ expect(comment).to include 'Build Number | 4203008 | ' # explicitly provided, overriding the implicit value
+ expect(comment).not_to include 'Build Number | 1287003 | ' # otherwise implicitly added if it were not overridden
+ expect(comment).to include 'Build Config | Prototype | ' # not overriding any implicit one
+ # Additional inferred metadata rows: App Name, Application ID, Commit, App Center Build
+ expect(comment).to include "Bundle ID | com.example.myapp | '
- expect(comment).not_to include 'Application ID'
- end
+ it 'uses "Application ID" as the name for the `bundle_identifier` value if using Android', app_os: 'Android' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My App',
+ app_center_org_name: 'My-Org'
+ )
+ expect(comment).to include 'Application ID | com.stubfactory.myapp | '
+ expect(comment).not_to include 'Bundle ID'
end
- end
- describe 'footnote behavior' do
- it 'includes the default Firebase footnote if no explicit footnote is provided' do
+ it 'uses "Bundle ID" as the name for the `bundle_identifier` value if using iOS', app_os: 'iOS' do
comment = run_described_fastlane_action(
- app_display_name: 'My App'
+ app_display_name: 'My App',
+ app_center_org_name: 'My-Org'
)
- expect(comment).to include described_class::DEFAULT_FOOTNOTE
+ expect(comment).to include 'Bundle ID | com.stubfactory.myapp | '
+ expect(comment).not_to include 'Application ID'
+ end
+
+ it 'includes the direct link if one is provided' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My App',
+ app_center_org_name: 'My-Org',
+ download_url: 'https://foo.cloudfront.net/someuuid/myapp-prototype-build-pr1337-a1b2c3f.apk'
+ )
+ expect(comment).to include "Direct Download | myapp-prototype-build-pr1337-a1b2c3f.apk | "
+ # Inferred metadata rows: App Name, Build Number, Version, Application ID, Commit, Direct Download, App Center Build
+ expect(comment).to include "Direct Download | myapp.apk | "
- end
+ comment = run_described_fastlane_action(
+ app_display_name: 'The Best App',
+ app_center_org_name: 'BestOrg',
+ metadata: metadata,
+ footnote: 'Note: Google Sign-In in not available in those builds'
+ )
- it 'does not include any default footnote if no explicit footnote is provided' do
- comment = run_described_fastlane_action(
- app_display_name: 'My App',
- download_url: 'https://example.com/myapp.apk'
- )
- expect(comment).not_to include described_class::DEFAULT_FOOTNOTE
- end
+ expect(comment).to eq <<~EXPECTED_COMMENT
+
📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
+
+
+  |
+ App Name | The Best App |
+
+ Configuration | Debug |
+ Build Number | 1287003 |
+ Version | 28.7 |
+ Application ID | com.stubfactory.myapp |
+ Commit | a1b2c3f |
+ App Center Build | My App (Alpha) #1337 |
+
+ Note: Google Sign-In in not available in those builds
+ EXPECTED_COMMENT
+ end
- it 'includes the provided footnote if one was provided explicitly' do
- comment = run_described_fastlane_action(
- app_display_name: 'My App',
- download_url: 'https://example.com/myapp.apk',
- footnote: custom_footnote
- )
- expect(comment).to include custom_footnote
- end
+ it 'generates a HTML table comment including the direct link if provided' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'The Best App',
+ app_center_org_name: 'BestOrg',
+ download_url: 'https://bestfront.cloudfront.net/feed42/bestapp-pr1357-a1b2c3f.apk'
+ )
- it 'includes the default footnote if no explicit one is provided but the download URL is a Firebase URL' do
- comment = run_described_fastlane_action(
- app_display_name: 'My App',
- download_url: 'https://appdistribution.firebase.google.com/testerapps/1:123456:ios:abcdef/releases/xyz'
- )
- expect(comment).to include described_class::DEFAULT_FOOTNOTE
- end
- end
+ expect(comment).to eq <<~EXPECTED_COMMENT
+
📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
+
+ Automatticians: You can use our internal self-serve MC tool to give yourself access to App Center if needed.
+ EXPECTED_COMMENT
+ end
- describe 'validating full comment' do
- it 'generates a standard HTML table comment by default' do
- metadata = {
- 'Version Name': '28.2',
- 'Version Code': '1280200108',
- Flavor: 'Debug'
- }
+ it 'generates a HTML table in a spoiler block if fold is true' do
+ metadata = {
+ 'Google Login': 'Disabled'
+ }
- comment = run_described_fastlane_action(
- app_display_name: 'The Best App',
- download_url: 'https://example.com/bestapp.apk',
- metadata: metadata,
- app_icon: ':jetpack:'
- )
+ comment = run_described_fastlane_action(
+ app_display_name: 'The Best App',
+ app_center_org_name: 'BestOrg',
+ fold: true,
+ metadata: metadata,
+ footnote: 'Note: Google Sign-In in not available in those builds'
+ )
- expect(comment).to eq <<~EXPECTED_COMMENT
-
📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
-
-
-  |
- App Name | The Best App |
-
- Version Name | 28.2 |
- Version Code | 1280200108 |
- Flavor | Debug |
- Build Number |
|
- Version |
|
- Application ID |
|
- Commit | a1b2c3f |
- Direct Download | bestapp.apk |
-
- EXPECTED_COMMENT
+ expect(comment).to eq <<~EXPECTED_COMMENT
+
📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
+
+
+  |
+ App Name | The Best App |
+
+ Google Login | Disabled |
+ Build Number | 1287003 |
+ Version | 28.7 |
+ Application ID | com.stubfactory.myapp |
+ Commit | a1b2c3f |
+ App Center Build | My App (Alpha) #1337 |
+
+ Note: Google Sign-In in not available in those builds
+
+ EXPECTED_COMMENT
+ end
end
+ end
- it 'generates a HTML table in a spoiler block if fold is true' do
- metadata = {
- 'Version Name': '28.2',
- 'Version Code': '1280200108'
- }
-
- comment = run_described_fastlane_action(
- app_display_name: 'The Best App',
- download_url: 'https://example.com/bestapp.apk',
- fold: true,
- metadata: metadata,
- footnote: custom_footnote
- )
-
- expect(comment).to eq <<~EXPECTED_COMMENT
- 📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
-
-
-  |
- App Name | The Best App |
-
- Version Name | 28.2 |
- Version Code | 1280200108 |
- Build Number |
|
- Version |
|
- Application ID |
|
- Commit | a1b2c3f |
- Direct Download | bestapp.apk |
-
- Note: Google Sign-In is not available in those builds
-
- EXPECTED_COMMENT
+ context 'when not using App Center' do
+ it 'raises an error if no `download_url` is provided' do
+ expect do
+ run_described_fastlane_action(
+ app_display_name: 'My App'
+ )
+ end.to raise_error(FastlaneCore::Interface::FastlaneError, described_class::NO_INSTALL_URL_ERROR_MESSAGE)
end
- end
- describe 'app_icon handling' do
- context 'when providing an URL' do
- it 'includes the icon in the intro text' do
- comment = run_described_fastlane_action(base_params.merge(app_icon: valid_app_icon_url))
- expect(comment).to include "
📲 "
+ describe 'checking specific content is present' do
+ it 'generates the proper QR code from the download url' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My App',
+ download_url: 'https://foo.cloudfront.net/someuuid/myapp-prototype-build-pr1337-a1b2c3f.apk'
+ )
+ expect(comment).to include 'https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Ffoo.cloudfront.net%2Fsomeuuid%2Fmyapp-prototype-build-pr1337-a1b2c3f.apk'
end
- end
- context 'when providing an emoji code' do
- it 'includes the icon in the intro text' do
- comment = run_described_fastlane_action(base_params.merge(app_icon: ':jetpack:'))
- expect(comment).to include "
📲 "
+ it 'includes the direct link as metadata' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My App',
+ download_url: 'https://foo.cloudfront.net/someuuid/myapp-prototype-build-pr1337-a1b2c3f.apk'
+ )
+ expect(comment).to include "Direct Download | myapp-prototype-build-pr1337-a1b2c3f.apk | "
end
- it 'handles emoji codes with special characters' do
- comment = run_described_fastlane_action(base_params.merge(app_icon: ':plus-one:'))
- expect(comment).to include 'plus-one.png'
+ it 'does not include the App Center default footnote if no explicit footnote is provided' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My App',
+ download_url: 'https://localhost/foo.apk'
+ )
+ expect(comment).not_to include described_class::DEFAULT_APP_CENTER_FOOTNOTE
+ end
+
+ it 'includes the provided footnote if one was provided explicitly' do
+ comment = run_described_fastlane_action(
+ app_display_name: 'My App',
+ download_url: 'https://localhost/foo.apk',
+ footnote: 'The link to this APK might stop working after a retention delay of 30 days.'
+ )
+ expect(comment).to include 'The link to this APK might stop working after a retention delay of 30 days.'
end
end
- context 'when no icon is provided' do
- context 'when using Firebase App Distribution' do
- let(:firebase_release_info) do
- {
- displayVersion: '28.7',
- buildVersion: '1287003',
- testingUri: 'https://appdistribution.firebase.google.com/testerapps/1:123456:ios:abcdef/releases/xyz',
- firebaseConsoleUri: 'https://console.firebase.google.com/project/apps-test/appdistribution/app/ios:com.example.myapp/releases/xyz'
- }
- end
+ describe 'validating full comment' do
+ it 'generates a standard HTML table comment by default, with all the information provided' do
+ metadata = {
+ 'Version Name': '28.2',
+ 'Version Code': '1280200108',
+ Flavor: 'Celray'
+ }
- before do
- stub_const('Fastlane::Actions::SharedValues::FIREBASE_APP_DISTRO_RELEASE', :firebase_app_distro_release)
- allow(Fastlane::Actions).to receive(:lane_context).and_return({ firebase_app_distro_release: firebase_release_info })
- end
+ comment = run_described_fastlane_action(
+ app_display_name: 'The Best App',
+ download_url: 'https://bestfront.cloudfront.net/feed42/bestapp-pr1357-a1b2c3f.apk',
+ metadata: metadata,
+ footnote: 'Note: Google Sign-In in not available in those builds'
+ )
- it 'uses the firebase icon' do
- comment = run_described_fastlane_action(app_display_name: 'My App')
- expect(comment).to include 'firebase.png'
- end
+ expect(comment).to eq <<~EXPECTED_COMMENT
+ 📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
+
+
+  |
+ App Name | The Best App |
+
+ Version Name | 28.2 |
+ Version Code | 1280200108 |
+ Flavor | Celray |
+ Commit | a1b2c3f |
+ Direct Download | bestapp-pr1357-a1b2c3f.apk |
+
+ Note: Google Sign-In in not available in those builds
+ EXPECTED_COMMENT
end
- context 'when using a Firebase download URL' do
- it 'uses the firebase icon' do
- comment = run_described_fastlane_action(
- app_display_name: 'My App',
- download_url: 'https://appdistribution.firebase.google.com/testerapps/1:123456:ios:abcdef/releases/xyz'
- )
- expect(comment).to include 'firebase.png'
- end
- end
+ it 'generates a HTML table in a spoiler block if fold is true' do
+ metadata = {
+ 'Version Name': '28.2',
+ 'Version Code': '1280200108',
+ Flavor: 'Celray',
+ Configuration: 'Debug'
+ }
- context 'when using a non-Firebase download URL' do
- it 'does not include any icon' do
- comment = run_described_fastlane_action(base_params.merge(app_icon: nil))
- expect(comment).not_to include 'firebase.png'
- expect(comment).to match(/^📲 You can test/)
- end
+ comment = run_described_fastlane_action(
+ app_display_name: 'The Best App',
+ download_url: 'https://bestfront.cloudfront.net/feed42/bestapp-pr1357-a1b2c3f.apk',
+ fold: true,
+ metadata: metadata,
+ footnote: 'Note: Google Sign-In in not available in those builds'
+ )
+
+ expect(comment).to eq <<~EXPECTED_COMMENT
+ 📲 You can test the changes from this Pull Request in The Best App by scanning the QR code below to install the corresponding build.
+
+
+  |
+ App Name | The Best App |
+
+ Version Name | 28.2 |
+ Version Code | 1280200108 |
+ Flavor | Celray |
+ Configuration | Debug |
+ Commit | a1b2c3f |
+ Direct Download | bestapp-pr1357-a1b2c3f.apk |
+
+ Note: Google Sign-In in not available in those builds
+
+ EXPECTED_COMMENT
end
end
end