Skip to content

Commit

Permalink
Run screenshots action on Github
Browse files Browse the repository at this point in the history
  • Loading branch information
Jon Petersson committed Dec 6, 2023
1 parent df3262c commit cb6d731
Show file tree
Hide file tree
Showing 9 changed files with 303 additions and 39 deletions.
82 changes: 49 additions & 33 deletions .github/workflows/ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,37 +9,37 @@ on:
- ios/**/*.xctestplan
workflow_dispatch:
jobs:
check-formatting:
name: Check formatting
runs-on: macos-13-xlarge
steps:
- name: Install SwiftFormat
run: |
brew update
brew upgrade swiftformat
# check-formatting:
# name: Check formatting
# runs-on: macos-13-xlarge
# steps:
# - name: Install SwiftFormat
# run: |
# brew update
# brew upgrade swiftformat

- name: Checkout repository
uses: actions/checkout@v3
# - name: Checkout repository
# uses: actions/checkout@v3

- name: Check formatting
run: |
swiftformat --version
swiftformat --lint .
working-directory: ios
# - name: Check formatting
# run: |
# swiftformat --version
# swiftformat --lint .
# working-directory: ios

swiftlint:
name: Run swiftlint
runs-on: macos-13-xlarge
steps:
- name: Checkout repository
uses: actions/checkout@v3
# swiftlint:
# name: Run swiftlint
# runs-on: macos-13-xlarge
# steps:
# - name: Checkout repository
# uses: actions/checkout@v3

- name: Run swiftlint
run: |
brew install swiftlint
swiftlint --version
swiftlint --reporter github-actions-logging
working-directory: ios
# - name: Run swiftlint
# run: |
# brew install swiftlint
# swiftlint --version
# swiftlint --reporter github-actions-logging
# working-directory: ios

test:
name: Unit tests
Expand Down Expand Up @@ -83,17 +83,33 @@ jobs:
cp Screenshots.xcconfig.template Screenshots.xcconfig
working-directory: ios/Configurations

- name: Install xcbeautify
run: |
brew update
brew install xcbeautify
- name: Bundle
run: bundle install
working-directory: ios

# - name: Install xcbeautify
# run: |
# brew update
# brew install xcbeautify

# - name: Run tests
# run: |
# set -o pipefail && env NSUnbufferedIO=YES xcodebuild \
# -project MullvadVPN.xcodeproj \
# -scheme MullvadVPN \
# -testPlan MullvadVPNCI \
# -destination "platform=iOS Simulator,name=iPhone 15" \
# -clonedSourcePackagesDirPath "$SOURCE_PACKAGES_PATH" \
# test 2>&1 | xcbeautify
# working-directory: ios/

- name: Run tests
- name: Run screenshots
# run: bundle exec fastlane snapshot
run: |
set -o pipefail && env NSUnbufferedIO=YES xcodebuild \
-project MullvadVPN.xcodeproj \
-scheme MullvadVPN \
-testPlan MullvadVPNCI \
-testPlan MullvadVPNScreenshots \
-destination "platform=iOS Simulator,name=iPhone 15" \
-clonedSourcePackagesDirPath "$SOURCE_PACKAGES_PATH" \
test 2>&1 | xcbeautify
Expand Down
2 changes: 1 addition & 1 deletion ios/MullvadVPNScreenshots/MullvadVPNScreenshots.swift
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ class MullvadVPNScreenshots: XCTestCase {

// Select Sweden, Gothenburg in Select location controller
if case .phone = UIDevice.current.userInterfaceIdiom {
_ = app.buttons["SelectLocationButton"].waitForExistence(timeout: 10)
_ = app.buttons["SelectLocationButton"].waitForExistence(timeout: 30)
app.buttons["SelectLocationButton"].tap()

Check failure on line 63 in ios/MullvadVPNScreenshots/MullvadVPNScreenshots.swift

View workflow job for this annotation

GitHub Actions / Unit tests

testTakeScreenshots, Failed to tap "SelectLocationButton" Button: No matches found for Elements matching predicate '"SelectLocationButton" IN identifiers' from input {(
}

Expand Down
Binary file added ios/Screenshots/en-US/iPhone 15 Pro-Account.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
252 changes: 252 additions & 0 deletions ios/Screenshots/screenshots.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,252 @@
<!DOCTYPE html>
<html>
<head>
<title>fastlane/snapshot</title>
<meta charset="UTF-8">
<style type="text/css">
* {
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
font-weight: 300;
}
#sortMenu {
overflow: hidden;
border: 1px solid #ccc;
background-color: #f1f1f1;
display: none;
}
#sortMenu button {
background-color: inherit;
float: left;
border: none;
outline: none;
cursor: pointer;
padding: 14px 16px;
font-size: 17px;
}
#sortMenu button:hover {
background-color: #ddd;
}
#sortMenu button.active {
background-color: #ccc;
}
.deviceName {
display: block;
font-size: 30px;
padding-bottom: 24px;
padding-top: 45px;
}
.screenshot {
cursor: pointer;
border: 1px #EEE solid;
z-index: 0;
}
.caption {
font-size: 24px;
padding-bottom: 24px;
padding-top: 30px;
}
h1, h2 {
font-weight: bold;
}
th {
text-align: left;
}
td {
text-align: center;
min-width: 200px;
}
#overlay {
position:fixed;
top:0;
left:0;
background:rgba(0,0,0,0.8);
z-index:5;
width:100%;
height:100%;
display:none;
cursor: zoom-out;
text-align: center;
}
#imageDisplay {
height: auto;
width: auto;
z-index: 10;
cursor: pointer;
}
#imageInfo {
background: none repeat scroll 0 0 rgba(0, 0, 0, 0.2);
border-radius: 5px;
color: white;
margin: 20px;
padding: 10px;
position: absolute;
right: 0;
top: 0;
width: 250px;
z-index: -1;
}
#imageInfo:hover {
z-index: 20;
}
</style>
</head>
<body>
<div id="sortMenu">
<button id="defaultTab" class="tabLink" onclick="openTab(event, 'byLanguage')">By Language</button>
<button class="tabLink" onclick="openTab(event, 'byScreen')">By Screen</button>
</div>
<div id="byLanguage" class="tabContent"><h1 class="tabTitle">By Language:</h1>
</div>
<div id="byScreen" class="tabContent"><h1 class="tabTitle">By Screen:</h1>
</div>
<div id="overlay">
<img id="imageDisplay" src="" alt="" />
<div id="imageInfo"></div>
</div>
<script type="text/javascript">
var overlay = document.getElementById('overlay');
var imageDisplay = document.getElementById('imageDisplay');
var imageInfo = document.getElementById('imageInfo');
var screenshotLink = document.getElementsByClassName('screenshotLink');

window.onload = setup();

function setup() {
var i, menu, tabTitles;

// Since JS is enabled, show sort menu and hide tab titles
menu = document.getElementById("sortMenu");
menu.style.display = "block";

tabTitles = document.getElementsByClassName("tabTitle");
for (i = 0; i < tabTitles.length; i++) {
tabTitles[i].style.display = "none";
}

doClick(document.getElementById("defaultTab"));
}

function getCurrentTab() {
var i, tabs;
tabs = document.getElementsByClassName("tabContent");
for (i = 0; i < tabs.length; i++) {
if (tabs[i].style.display != "none") {
return i + 1;
}
}
return 1; // fallback
}

function openTab(evt, tabName) {
var i, tabContent, tabLinks;
tabs = document.getElementsByClassName("tabContent");
for (i = 0; i < tabs.length; i++) {
tabs[i].style.display = "none";
}
tabLinks = document.getElementsByClassName("tabLink");
for (i = 0; i < tabLinks.length; i++) {
tabLinks[i].className = tabLinks[i].className.replace(" active", "");
}
document.getElementById(tabName).style.display = "block";
evt.currentTarget.className += " active";
}

function doClick(el) {
if (document.createEvent) {
var evObj = document.createEvent('MouseEvents', true);
evObj.initMouseEvent("click", false, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
el.dispatchEvent(evObj);
} else if (document.createEventObject) { //IE
var evObj = document.createEventObject();
el.fireEvent('onclick', evObj);
}
}

for (index = 0; index < screenshotLink.length; ++index) {
screenshotLink[index].addEventListener('click', function(e) {
e.preventDefault();

var img = e.target;
if (e.target.tagName == 'A') {
img = e.target.children[0];
}

// beautify
var tmpImg = new Image();
tmpImg.src = img.src;
imageDisplay.style.height = 'auto';
imageDisplay.style.width = 'auto';
imageDisplay.style.paddingTop = 0;
if (window.innerHeight < tmpImg.height) {
imageDisplay.style.height = document.documentElement.clientHeight+'px';
} else if (window.innerWidth < tmpImg.width) {
imageDisplay.style.width = document.documentElement.clientWidth;+'px';
} else {
imageDisplay.style.paddingTop = parseInt((window.innerHeight - tmpImg.height) / 2)+'px';
}

imageDisplay.src = img.src;
imageDisplay.alt = img.alt;
imageDisplay.dataset.counter = img.dataset.counter;

imageInfo.innerHTML = '<h3>'+img.alt+'</h3>';
imageInfo.innerHTML += decodeURI(img.src.split("/").pop());
imageInfo.innerHTML += '<br />'+tmpImg.height+'&times;'+tmpImg.width+'px';

overlay.style.display = "block";
});
}

imageDisplay.addEventListener('click', function(e) {
e.stopPropagation(); // !

overlay.style.display = "none";

img_tab = parseInt(getCurrentTab());
img_counter = parseInt(e.target.dataset.counter) + 1;
try {
link = document.body.querySelector('img[data-tab="'+img_tab+'"][data-counter="'+img_counter+'"]').parentNode;
} catch (e) {
try {
link = document.body.querySelector('img[data-tab="'+img_tab+'"][data-counter="0"]').parentNode;
} catch (e) {
return false;
}
}
doClick(link);
});

overlay.addEventListener('click', function(e) {
overlay.style.display = "none";
})

function keyPressed(e) {
e = e || window.event;
var charCode = e.keyCode || e.which;
switch(charCode) {
case 27: // Esc
overlay.style.display = "none";
break;
case 34: // Page Down
case 39: // Right arrow
case 54: // Keypad right
case 76: // l
case 102: // Keypad right
e.preventDefault();
doClick(imageDisplay);
break;
case 33: // Page up
case 37: // Left arrow
case 52: // Keypad left
case 72: // h
case 100: // Keypad left
e.preventDefault();
document.getElementById('imageDisplay').dataset.counter -= 2; // hacky
doClick(imageDisplay);
break;
}
};
document.body.addEventListener('keydown', keyPressed);
</script>
</body>
</html>
6 changes: 1 addition & 5 deletions ios/Snapfile
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
# A list of devices you want to take the screenshots from
devices([
"iPhone 8 Plus", # 5.5"
"iPhone 11 Pro Max", # 6.5"
"iPhone 14 Pro Max", # 6.7"
"iPad Pro (12.9-inch) (2nd generation)",
"iPad Pro (12.9-inch) (6th generation)"
"iPhone 14"
])

languages([
Expand Down

0 comments on commit cb6d731

Please sign in to comment.