changeset 146:f10b0e188905 v1.3.1

Merge pull request #16 from DennisTechnologies/development Release v1.3.1 committer: GitHub <noreply@github.com>
author Dennis C. M. <dennis@denniscm.com>
date Tue, 17 Aug 2021 22:14:58 +0100
parents a6df002a0a5c (current diff) 407611b9df91 (diff)
children cbf8a128462e 70f0625bfcf1
files
diffstat 41 files changed, 427 insertions(+), 243 deletions(-) [+]
line wrap: on
line diff
--- a/.github/workflows/ios.yml	Thu Aug 05 16:50:29 2021 +0100
+++ b/.github/workflows/ios.yml	Tue Aug 17 22:14:58 2021 +0100
@@ -1,10 +1,8 @@
 name: Build and test
 
 on:
-  push:
-    branches: [ development ]
   pull_request:
-    branches: [ main, beta ]
+    branches: [ main ]
 
 jobs:
   build:
--- a/Gemfile.lock	Thu Aug 05 16:50:29 2021 +0100
+++ b/Gemfile.lock	Tue Aug 17 22:14:58 2021 +0100
@@ -7,7 +7,7 @@
     artifactory (3.0.15)
     atomos (0.1.3)
     aws-eventstream (1.1.1)
-    aws-partitions (1.482.0)
+    aws-partitions (1.487.0)
     aws-sdk-core (3.119.0)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.239.0)
@@ -36,7 +36,7 @@
     dotenv (2.7.6)
     emoji_regex (3.2.2)
     excon (0.85.0)
-    faraday (1.6.0)
+    faraday (1.7.0)
       faraday-em_http (~> 1.0)
       faraday-em_synchrony (~> 1.0)
       faraday-excon (~> 1.1)
@@ -60,8 +60,8 @@
     faraday-rack (1.0.0)
     faraday_middleware (1.1.0)
       faraday (~> 1.0)
-    fastimage (2.2.4)
-    fastlane (2.189.0)
+    fastimage (2.2.5)
+    fastlane (2.191.0)
       CFPropertyList (>= 2.3, < 4.0.0)
       addressable (>= 2.8, < 3.0.0)
       artifactory (~> 3.0)
@@ -189,7 +189,7 @@
     unicode-display_width (1.7.0)
     webrick (1.7.0)
     word_wrap (1.0.0)
-    xcodeproj (1.20.0)
+    xcodeproj (1.21.0)
       CFPropertyList (>= 2.3.3, < 4.0)
       atomos (~> 0.1.3)
       claide (>= 1.0.2, < 2.0)
--- a/Simoleon.xcodeproj/project.pbxproj	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon.xcodeproj/project.pbxproj	Tue Aug 17 22:14:58 2021 +0100
@@ -466,6 +466,8 @@
 				95C5B23C2697752700941585 /* PBXTargetDependency */,
 			);
 			name = SimoleonTests;
+			packageProductDependencies = (
+			);
 			productName = SimoleonTests;
 			productReference = 95C5B23A2697752700941585 /* SimoleonTests.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
@@ -737,8 +739,10 @@
 					"@executable_path/Frameworks",
 					"@loader_path/Frameworks",
 				);
+				OTHER_SWIFT_FLAGS = "";
 				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonScreenshots;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
 				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TEST_TARGET_NAME = Simoleon;
@@ -757,13 +761,168 @@
 					"@executable_path/Frameworks",
 					"@loader_path/Frameworks",
 				);
+				OTHER_SWIFT_FLAGS = "";
 				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonScreenshots;
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = "";
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				TEST_TARGET_NAME = Simoleon;
+			};
+			name = Release;
+		};
+		95B9EECD26CAC9EF00D94D60 /* Screenshots */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LIBRARY = "libc++";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu11;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.4;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+			};
+			name = Screenshots;
+		};
+		95B9EECE26CAC9EF00D94D60 /* Screenshots */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 9585BB0F26A6B58500E3193E /* Config.xcconfig */;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_ENTITLEMENTS = Simoleon/Simoleon.entitlements;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				DEVELOPMENT_ASSET_PATHS = "\"Simoleon/Preview Content\"";
+				DEVELOPMENT_TEAM = MTX83R5H8X;
+				ENABLE_PREVIEWS = YES;
+				INFOPLIST_FILE = Simoleon/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				MARKETING_VERSION = 1.3.1;
+				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.Simoleon;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = SCREENSHOTS;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+			};
+			name = Screenshots;
+		};
+		95B9EECF26CAC9EF00D94D60 /* Screenshots */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				BUNDLE_LOADER = "$(TEST_HOST)";
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = MTX83R5H8X;
+				INFOPLIST_FILE = SimoleonTests/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonTests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Simoleon.app/Simoleon";
+			};
+			name = Screenshots;
+		};
+		95B9EED026CAC9EF00D94D60 /* Screenshots */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = MTX83R5H8X;
+				INFOPLIST_FILE = SimoleonUITests/Info.plist;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonUITests;
+				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TEST_TARGET_NAME = Simoleon;
 			};
-			name = Release;
+			name = Screenshots;
+		};
+		95B9EED126CAC9EF00D94D60 /* Screenshots */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				CODE_SIGN_STYLE = Automatic;
+				DEVELOPMENT_TEAM = MTX83R5H8X;
+				INFOPLIST_FILE = SimoleonScreenshots/Info.plist;
+				IPHONEOS_DEPLOYMENT_TARGET = 14.5;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+					"@loader_path/Frameworks",
+				);
+				OTHER_SWIFT_FLAGS = "";
+				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.SimoleonScreenshots;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_VERSION = 5.0;
+				TARGETED_DEVICE_FAMILY = "1,2";
+				TEST_TARGET_NAME = Simoleon;
+			};
+			name = Screenshots;
 		};
 		95C5B24C2697752700941585 /* Debug */ = {
 			isa = XCBuildConfiguration;
@@ -892,7 +1051,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = Simoleon/Simoleon.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 6;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_ASSET_PATHS = "\"Simoleon/Preview Content\"";
 				DEVELOPMENT_TEAM = MTX83R5H8X;
 				ENABLE_PREVIEWS = YES;
@@ -902,7 +1061,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.3;
+				MARKETING_VERSION = 1.3.1;
 				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.Simoleon;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_VERSION = 5.0;
@@ -917,7 +1076,7 @@
 				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_ENTITLEMENTS = Simoleon/Simoleon.entitlements;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 6;
+				CURRENT_PROJECT_VERSION = 1;
 				DEVELOPMENT_ASSET_PATHS = "\"Simoleon/Preview Content\"";
 				DEVELOPMENT_TEAM = MTX83R5H8X;
 				ENABLE_PREVIEWS = YES;
@@ -927,7 +1086,7 @@
 					"$(inherited)",
 					"@executable_path/Frameworks",
 				);
-				MARKETING_VERSION = 1.3;
+				MARKETING_VERSION = 1.3.1;
 				PRODUCT_BUNDLE_IDENTIFIER = io.dennistech.Simoleon;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				SWIFT_VERSION = 5.0;
@@ -1026,6 +1185,7 @@
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				959F6DEF26BBD53500101E53 /* Debug */,
+				95B9EED126CAC9EF00D94D60 /* Screenshots */,
 				959F6DF026BBD53500101E53 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
@@ -1035,6 +1195,7 @@
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				95C5B24C2697752700941585 /* Debug */,
+				95B9EECD26CAC9EF00D94D60 /* Screenshots */,
 				95C5B24D2697752700941585 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
@@ -1044,6 +1205,7 @@
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				95C5B24F2697752700941585 /* Debug */,
+				95B9EECE26CAC9EF00D94D60 /* Screenshots */,
 				95C5B2502697752700941585 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
@@ -1053,6 +1215,7 @@
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				95C5B2522697752700941585 /* Debug */,
+				95B9EECF26CAC9EF00D94D60 /* Screenshots */,
 				95C5B2532697752700941585 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
@@ -1062,6 +1225,7 @@
 			isa = XCConfigurationList;
 			buildConfigurations = (
 				95C5B2552697752700941585 /* Debug */,
+				95B9EED026CAC9EF00D94D60 /* Screenshots */,
 				95C5B2562697752700941585 /* Release */,
 			);
 			defaultConfigurationIsVisible = 0;
--- a/Simoleon.xcodeproj/xcshareddata/xcschemes/Screenshots.xcscheme	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon.xcodeproj/xcshareddata/xcschemes/Screenshots.xcscheme	Tue Aug 17 22:14:58 2021 +0100
@@ -65,33 +65,13 @@
       </BuildActionEntries>
    </BuildAction>
    <TestAction
-      buildConfiguration = "Debug"
+      buildConfiguration = "Screenshots"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       shouldUseLaunchSchemeArgsEnv = "YES"
       disableMainThreadChecker = "YES">
       <Testables>
          <TestableReference
-            skipped = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "95C5B2392697752700941585"
-               BuildableName = "SimoleonTests.xctest"
-               BlueprintName = "SimoleonTests"
-               ReferencedContainer = "container:Simoleon.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
-            skipped = "YES">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "95C5B2442697752700941585"
-               BuildableName = "SimoleonUITests.xctest"
-               BlueprintName = "SimoleonUITests"
-               ReferencedContainer = "container:Simoleon.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
-         <TestableReference
             skipped = "NO">
             <BuildableReference
                BuildableIdentifier = "primary"
@@ -104,7 +84,7 @@
       </Testables>
    </TestAction>
    <LaunchAction
-      buildConfiguration = "Debug"
+      buildConfiguration = "Screenshots"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       disableMainThreadChecker = "YES"
--- a/Simoleon.xcodeproj/xcshareddata/xcschemes/Simoleon.xcscheme	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon.xcodeproj/xcshareddata/xcschemes/Simoleon.xcscheme	Tue Aug 17 22:14:58 2021 +0100
@@ -20,13 +20,56 @@
                ReferencedContainer = "container:Simoleon.xcodeproj">
             </BuildableReference>
          </BuildActionEntry>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "NO"
+            buildForProfiling = "NO"
+            buildForArchiving = "NO"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "95C5B2442697752700941585"
+               BuildableName = "SimoleonUITests.xctest"
+               BlueprintName = "SimoleonUITests"
+               ReferencedContainer = "container:Simoleon.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "NO"
+            buildForProfiling = "NO"
+            buildForArchiving = "NO"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "95C5B2392697752700941585"
+               BuildableName = "SimoleonTests.xctest"
+               BlueprintName = "SimoleonTests"
+               ReferencedContainer = "container:Simoleon.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+         <BuildActionEntry
+            buildForTesting = "NO"
+            buildForRunning = "NO"
+            buildForProfiling = "NO"
+            buildForArchiving = "NO"
+            buildForAnalyzing = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "959F6DE726BBD53500101E53"
+               BuildableName = "SimoleonScreenshots.xctest"
+               BlueprintName = "SimoleonScreenshots"
+               ReferencedContainer = "container:Simoleon.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
       </BuildActionEntries>
    </BuildAction>
    <TestAction
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      language = "en">
       <Testables>
          <TestableReference
             skipped = "NO">
@@ -48,22 +91,13 @@
                ReferencedContainer = "container:Simoleon.xcodeproj">
             </BuildableReference>
          </TestableReference>
-         <TestableReference
-            skipped = "NO">
-            <BuildableReference
-               BuildableIdentifier = "primary"
-               BlueprintIdentifier = "959F6DE726BBD53500101E53"
-               BuildableName = "SimoleonScreenshots.xctest"
-               BlueprintName = "SimoleonScreenshots"
-               ReferencedContainer = "container:Simoleon.xcodeproj">
-            </BuildableReference>
-         </TestableReference>
       </Testables>
    </TestAction>
    <LaunchAction
-      buildConfiguration = "Release"
+      buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      disableMainThreadChecker = "YES"
       launchStyle = "0"
       useCustomWorkingDirectory = "NO"
       ignoresPersistentStateOnLaunch = "NO"
--- a/Simoleon/Conversion.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/Conversion.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -12,7 +12,7 @@
     var showNavigationView: Bool?
     
     @State var currencyPair: String
-    @State private var amountToConvert = "1000"
+    @State private var amountToConvert = ""
     @State private var price: Double = 1.00
     @State private var showingConversion = false
     @State private var showingCurrencySelector = false
@@ -33,6 +33,7 @@
                                     .padding(.horizontal)
                             )
                     }
+                    .accessibilityIdentifier("OpenCurrencySelector")
                     
                     FavoriteButton(currencyPair: currencyPair)
                 }
@@ -59,7 +60,7 @@
                         UIApplication.shared.dismissKeyboard()
                         amountIsEditing = false
                     }) {
-                        Text("Cancel")
+                        Text("Done")
                     }
                 }
             }
--- a/Simoleon/Favorites.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/Favorites.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -11,14 +11,15 @@
     @Environment(\.managedObjectContext) private var viewContext
     @FetchRequest(
         sortDescriptors: [NSSortDescriptor(keyPath: \Favorite.currencyPair, ascending: true)],
-        animation: .default) private var favorite: FetchedResults<Favorite>
+        animation: .default) private var favorites: FetchedResults<Favorite>
     
     var body: some View {
         VStack {
-            if favorite.isEmpty {
+            if favorites.isEmpty {
                 Group {
                     Image(systemName: "star")
                         .font(.title)
+                    
                     Text("Search a currency pair and add it to favourites.")
                         .padding(.top, 5)
                 }
@@ -27,7 +28,7 @@
                 .padding(.horizontal, 50)
             } else {
                 List {
-                    ForEach(favorite) { favorite in
+                    ForEach(favorites) { favorite in
                         NavigationLink(destination: Conversion(showNavigationView: false, currencyPair: favorite.currencyPair)) {
                             CurrencyRow(currencyPairName: favorite.currencyPair)
                         }
@@ -47,15 +48,15 @@
             NavigationView { content }
         }
         .onAppear {
-            #if DEBUG
-            generateFavoritesToScreenshots()
+            #if SCREENSHOTS
+            generateFavoritesForScreenshots()
             #endif
         }
     }
     
     private func removeFromFavorites(offsets: IndexSet) {
         withAnimation {
-            offsets.map { favorite[$0] }.forEach(viewContext.delete)
+            offsets.map { favorites[$0] }.forEach(viewContext.delete)
             
             do {
                 try viewContext.save()
@@ -66,17 +67,22 @@
         }
     }
 
-    #if DEBUG
-    private func generateFavoritesToScreenshots() {
-        if favorite.isEmpty {
-            let favoriteCurrencies = [
-                "EUR/USD", "BTC/USD", "USD/HKD", "USD/JPY", "AUD/USD",
-                "XAU/GBP", "DASH/ETH", "EUR/USD", "XAG/CAD"
-            ]
-            
-            for favoriteCurrency in favoriteCurrencies {
-                let favorite = Favorite(context: viewContext)
-                favorite.currencyPair = favoriteCurrency
+    #if SCREENSHOTS
+    /*
+     Save currencies to favourites to take screenshots for the App Store
+     */
+    private func generateFavoritesForScreenshots() {
+        let favoriteCurrencies = [
+            "EUR/USD", "BTC/USD", "USD/HKD", "USD/JPY", "AUD/USD",
+            "XAU/GBP", "DASH/ETH", "EUR/USD", "XAG/CAD"
+        ]
+        
+        let coreDataCurrencyPairs = favorites.map { $0.currencyPair }
+        
+        for favoriteCurrency in favoriteCurrencies {
+            if !coreDataCurrencyPairs.contains(favoriteCurrency) {
+                let favorites = Favorite(context: viewContext)
+                favorites.currencyPair = favoriteCurrency
                 
                 do {
                     try viewContext.save()
--- a/Simoleon/Helpers/ConversionBox.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/Helpers/ConversionBox.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -40,7 +40,7 @@
                 .keyboardType(.decimalPad)
                 .font(Font.title.weight(.semibold))
                 .lineLimit(1)
-                .padding(.bottom, 10)
+                .accessibilityIdentifier("ConversionTextField")
             }
             
             Divider()
@@ -68,7 +68,7 @@
      else:
      * Return zero
      */
-    private func makeConversion() -> Double {
+    func makeConversion() -> Double {
         if let amountToConvert = Double(amountToConvert) {
             return amountToConvert * price  // Conversion
         } else {
--- a/Simoleon/Helpers/CurrencySelector.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/Helpers/CurrencySelector.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -40,6 +40,7 @@
             VStack {
                 SearchBar(placeholder: "Search...", text: $searchCurrency)
                     .padding()
+                    .accessibilityIdentifier("CurrencySearchBar")
                 
                 List {
                     if entitlementIsActive {
@@ -97,7 +98,7 @@
     
     // Check if user subscription is active
     private func checkEntitlement() {
-        #if DEBUG
+        #if SCREENSHOTS
         entitlementIsActive = true
         #else
         Purchases.shared.purchaserInfo { (purchaserInfo, error) in
--- a/Simoleon/Helpers/FavoriteButton.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/Helpers/FavoriteButton.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -11,12 +11,12 @@
     var currencyPair: String
     
     @Environment(\.managedObjectContext) private var viewContext
-    @FetchRequest(sortDescriptors: []) private var favorite: FetchedResults<Favorite>
+    @FetchRequest(sortDescriptors: []) private var favorites: FetchedResults<Favorite>
     
     @State private var starSymbol = "star"
     
     var body: some View {
-        let favoriteCurrencyPairs = favorite.map { $0.currencyPair }
+        let favoriteCurrencyPairs = favorites.map { $0.currencyPair }
         Button(action: { favoriteAction(favoriteCurrencyPairs) }) {
             RoundedRectangle(cornerRadius: 15)
                 .foregroundColor(Color(.secondarySystemBackground))
@@ -27,6 +27,7 @@
                         .foregroundColor(Color(.systemYellow))
                 )
         }
+        .accessibilityIdentifier("AddToFavorites")
     }
     
     /*
@@ -65,7 +66,7 @@
      */
     private func removeFromFavorites() {
         withAnimation {
-            let favoriteObject = favorite.first(where: { $0.currencyPair == currencyPair })
+            let favoriteObject = favorites.first(where: { $0.currencyPair == currencyPair })
             viewContext.delete(favoriteObject ?? Favorite())
             
             do {
--- a/Simoleon/Helpers/Sidebar.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/Helpers/Sidebar.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -16,17 +16,21 @@
             NavigationLink(destination: Conversion(currencyPair: defaultCurrency.first?.pair ?? "USD/GBP")) {
                 Label("Convert", systemImage: "arrow.counterclockwise.circle")
             }
+            .accessibilityIdentifier("NavigateToConversion")
             
             NavigationLink(destination: Favorites()) {
                 Label("Favorites", systemImage: "star")
             }
+            .accessibilityIdentifier("NavigateToFavorites")
             
             NavigationLink(destination: Settings()) {
                 Label("Settings", systemImage: "gear")
             }
+            .accessibilityIdentifier("NavigateToSettings")
         }
         .listStyle(SidebarListStyle())
         .navigationTitle("Categories")
+        .accessibilityIdentifier("Sidebar")
     }
 }
 
--- a/Simoleon/Info.plist	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/Info.plist	Tue Aug 17 22:14:58 2021 +0100
@@ -23,7 +23,7 @@
 	<key>CFBundleShortVersionString</key>
 	<string>$(MARKETING_VERSION)</string>
 	<key>CFBundleVersion</key>
-	<string>6</string>
+	<string>1</string>
 	<key>LSRequiresIPhoneOS</key>
 	<true/>
 	<key>PURCHASES_KEY</key>
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/de.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/en-GB.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/en.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/es.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/fr.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/it.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/nl.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/pt-PT.lproj/Localizable.strings has changed
Binary file Simoleon/Localization/en.xcloc/Source Contents/Simoleon/ru.lproj/Localizable.strings has changed
--- a/Simoleon/Resources/es.lproj/CurrencyMetadata.json	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/Resources/es.lproj/CurrencyMetadata.json	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,6 @@
 {
     "AED": {
-        "name": "D\u00edrham De Los Emiratos \u00c1rabes Unidos",
+        "name": "D\u00edrham de los Emiratos \u00c1rabes Unidos",
         "flag": "AE"
     },
     "AFN": {
@@ -16,7 +16,7 @@
         "flag": "AM"
     },
     "ANG": {
-        "name": "Flor\u00edn De Las Antillas Neerlandesas",
+        "name": "Flor\u00edn de las Antillas Neerlandesas",
         "flag": "CW"
     },
     "AOA": {
@@ -40,15 +40,15 @@
         "flag": "AU"
     },
     "AWG": {
-        "name": "Flor\u00edn De Aruba",
+        "name": "Flor\u00edn de Aruba",
         "flag": "AW"
     },
     "BAM": {
-        "name": "Marco Convertible De Bosnia Y Herzegovina",
+        "name": "Marco Convertible de Bosnia y Herzegovina",
         "flag": "BA"
     },
     "BBD": {
-        "name": "D\u00f3lar De Barbados",
+        "name": "D\u00f3lar de Barbados",
         "flag": "BB"
     },
     "BDT": {
@@ -68,11 +68,11 @@
         "flag": "BI"
     },
     "BMD": {
-        "name": "D\u00f3lar De Las Bermudas",
+        "name": "D\u00f3lar de las Bermudas",
         "flag": "BM"
     },
     "BND": {
-        "name": "D\u00f3lares De Brunei",
+        "name": "D\u00f3lares de Brunei",
         "flag": "BN"
     },
     "BOB": {
@@ -88,7 +88,7 @@
         "flag": "BR"
     },
     "BSD": {
-        "name": "D\u00f3lar De Las Bahamas",
+        "name": "D\u00f3lar de las Bahamas",
         "flag": "BS"
     },
     "BTN": {
@@ -120,7 +120,7 @@
         "flag": "CH"
     },
     "CLF": {
-        "name": "Unidad De Cuenta Chilena",
+        "name": "Unidad de Cuenta Chilena",
         "flag": "CL"
     },
     "CLP": {
@@ -148,7 +148,7 @@
         "flag": "CU"
     },
     "CVE": {
-        "name": "Escudo De Cabo Verde",
+        "name": "Escudo de Cabo Verde",
         "flag": "CV"
     },
     "CYP": {
@@ -160,7 +160,7 @@
         "flag": "CZ"
     },
     "DJF": {
-        "name": "Franco De Yibuti",
+        "name": "Franco de Yibuti",
         "flag": "DJ"
     },
     "DKK": {
@@ -192,7 +192,7 @@
         "flag": "EU"
     },
     "FJD": {
-        "name": "D\u00f3lar De Fiji",
+        "name": "D\u00f3lar de Fiji",
         "flag": "FJ"
     },
     "FRN": {
@@ -208,11 +208,11 @@
         "flag": "GE"
     },
     "GHS": {
-        "name": "Cedi De Ghana",
+        "name": "Cedi de Ghana",
         "flag": "GH"
     },
     "GMD": {
-        "name": "Dalasi De Gambia",
+        "name": "Dalasi de Gambia",
         "flag": "GM"
     },
     "GNF": {
@@ -224,11 +224,11 @@
         "flag": "GT"
     },
     "GYD": {
-        "name": "D\u00f3lar De Guyana",
+        "name": "D\u00f3lar de Guyana",
         "flag": "GY"
     },
     "HKD": {
-        "name": "Dolar De Hong Kong",
+        "name": "Dolar de Hong Kong",
         "flag": "HK"
     },
     "HNL": {
@@ -292,7 +292,7 @@
         "flag": "KH"
     },
     "KMF": {
-        "name": "Franco De Las Comoras",
+        "name": "Franco de las Comoras",
         "flag": "KM"
     },
     "KRU": {
@@ -308,7 +308,7 @@
         "flag": "KW"
     },
     "KYD": {
-        "name": "D\u00f3lar De Las Islas Caim\u00e1n",
+        "name": "D\u00f3lar de las Islas Caim\u00e1n",
         "flag": "KY"
     },
     "KZT": {
@@ -324,11 +324,11 @@
         "flag": "LB"
     },
     "LFX": {
-        "name": "Tesoros De Sukuk",
+        "name": "Tesoros de Sukuk",
         "flag": "MY"
     },
     "LKR": {
-        "name": "Rupia De Sri Lanka",
+        "name": "Rupia de Sri Lanka",
         "flag": "LK"
     },
     "LRD": {
@@ -336,7 +336,7 @@
         "flag": "LR"
     },
     "LSL": {
-        "name": "Loti De Lesoto",
+        "name": "Loti de Lesoto",
         "flag": "LS"
     },
     "LTL": {
@@ -356,7 +356,7 @@
         "flag": "MA"
     },
     "MAL": {
-        "name": "Hoja De Arce",
+        "name": "Hoja de Arce",
         "flag": "MA"
     },
     "MDL": {
@@ -372,11 +372,11 @@
         "flag": "MK"
     },
     "MMK": {
-        "name": "Kyat De Myanmar",
+        "name": "Kyat de Myanmar",
         "flag": "MM"
     },
     "MOP": {
-        "name": "Pataca De Macao",
+        "name": "Pataca de Macao",
         "flag": "MO"
     },
     "MRU": {
@@ -388,11 +388,11 @@
         "flag": "MT"
     },
     "MUR": {
-        "name": "Rupia De Mauricio",
+        "name": "Rupia de Mauricio",
         "flag": "MU"
     },
     "MVR": {
-        "name": "Rufiyaa De Maldivas",
+        "name": "Rufiyaa de Maldivas",
         "flag": "MV"
     },
     "MWK": {
@@ -412,11 +412,11 @@
         "flag": "MZ"
     },
     "NAD": {
-        "name": "D\u00f3lar De Namibia",
+        "name": "D\u00f3lar de Namibia",
         "flag": "NA"
     },
     "NBL": {
-        "name": "Isla De Man Noble",
+        "name": "Isla de Man Noble",
         "flag": "IM"
     },
     "NGN": {
@@ -440,7 +440,7 @@
         "flag": "GB"
     },
     "NZD": {
-        "name": "Dolar De Nueva Zelanda",
+        "name": "Dolar de Nueva Zelanda",
         "flag": "NZ"
     },
     "OMR": {
@@ -480,7 +480,7 @@
         "flag": "PY"
     },
     "QAR": {
-        "name": "Riyal De Qatar",
+        "name": "Riyal de Qatar",
         "flag": "QA"
     },
     "RON": {
@@ -504,11 +504,11 @@
         "flag": "SA"
     },
     "SBD": {
-        "name": "D\u00f3lar De Las Islas Salom\u00f3n",
+        "name": "D\u00f3lar de las Islas Salom\u00f3n",
         "flag": "SB"
     },
     "SCR": {
-        "name": "Rupia De Seychelles",
+        "name": "Rupia de Seychelles",
         "flag": "SC"
     },
     "SDG": {
@@ -520,11 +520,11 @@
         "flag": "SE"
     },
     "SGD": {
-        "name": "Dolar De Singapur",
+        "name": "Dolar de Singapur",
         "flag": "SG"
     },
     "SHP": {
-        "name": "Libra De Santa Elena",
+        "name": "Libra de Santa Elena",
         "flag": "SH"
     },
     "SLL": {
@@ -540,7 +540,7 @@
         "flag": "SR"
     },
     "STN": {
-        "name": "Dobra De Santo Tom\u00e9",
+        "name": "Dobra de Santo Tom\u00e9",
         "flag": "ST"
     },
     "SVC": {
@@ -560,7 +560,7 @@
         "flag": "TJ"
     },
     "TMT": {
-        "name": "Manat De Turkmenist\u00e1n",
+        "name": "Manat de Turkmenist\u00e1n",
         "flag": "TM"
     },
     "TND": {
@@ -576,7 +576,7 @@
         "flag": "TR"
     },
     "TTD": {
-        "name": "D\u00f3lar De Trinidad Y Tobago",
+        "name": "D\u00f3lar de Trinidad y Tobago",
         "flag": "TT"
     },
     "TWD": {
@@ -584,7 +584,7 @@
         "flag": "TW"
     },
     "TZS": {
-        "name": "Chel\u00edn De Tanzania",
+        "name": "Chel\u00edn de Tanzania",
         "flag": "TZ"
     },
     "UAH": {
@@ -596,7 +596,7 @@
         "flag": "UG"
     },
     "USD": {
-        "name": "D\u00f3lar De Los Estados Unidos",
+        "name": "D\u00f3lar de los Estados Unidos",
         "flag": "US"
     },
     "UYU": {
@@ -676,11 +676,11 @@
         "flag": "ZA"
     },
     "ZMW": {
-        "name": "Kwacha De Zambia",
+        "name": "Kwacha de Zambia",
         "flag": "ZM"
     },
     "ZWD": {
-        "name": "D\u00f3lar De Zimbabwe",
+        "name": "D\u00f3lar de Zimbabwe",
         "flag": "ZW"
     },
     "DASH": {
--- a/Simoleon/Settings.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/Settings.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -150,7 +150,7 @@
     
     // Check if user subscription is active
     private func checkEntitlement() {
-        #if DEBUG
+        #if SCREENSHOTS
         entitlementIsActive = true
         #else
         Purchases.shared.purchaserInfo { (purchaserInfo, error) in
--- a/Simoleon/SubscriptionPaywall.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/Simoleon/SubscriptionPaywall.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -27,6 +27,8 @@
                             Text("Unlock All Access")
                                 .font(.title)
                                 .fontWeight(.semibold)
+                                .fixedSize(horizontal: false, vertical: true)
+                                .multilineTextAlignment(.center)
                                 .padding(.top)
                         }
                         
--- a/SimoleonScreenshots/SimoleonScreenshots.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/SimoleonScreenshots/SimoleonScreenshots.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -6,15 +6,17 @@
 //
 
 import XCTest
-
+import CoreData
+// Automate screenshots with Fastlane
 class SimoleonScreenshots: XCTestCase {
-    var screnshotEndingName = ""
+    var screenshotEndingName = ""
 
     override func setUpWithError() throws {
-        // Put setup code here. This method is called before the invocation of each test method in the class.
+        // This method is called before the invocation of each test method in the class.
+        
         if UIDevice.current.userInterfaceIdiom == .pad {
             XCUIDevice.shared.orientation = .landscapeLeft
-            screnshotEndingName = "-force_landscapeleft"
+            screenshotEndingName = "-force_landscapeleft"
         }
         
         let app = XCUIApplication()
@@ -23,51 +25,50 @@
 
         // In UI tests it is usually best to stop immediately when a failure occurs.
         continueAfterFailure = false
-
-        // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
     }
 
     override func tearDownWithError() throws {
         // Put teardown code here. This method is called after the invocation of each test method in the class.
     }
 
-    // MARK: - Automate screenshots
-    func testLaunch() {
+    func testLaunchScreenshot() throws {
         if UIDevice.current.userInterfaceIdiom == .pad {
-            XCUIApplication().tables.buttons.firstMatch.tap()
+            XCUIApplication().tables["Sidebar"].buttons["NavigateToConversion"].tap()
         }
         
-        snapshot("1Launch\(screnshotEndingName)")
+        sleep(2)
+        snapshot("1Launch\(screenshotEndingName)")
     }
     
-    func testCurrencySelector() {
+    func testConvertAmountScreenshot() throws {
         if UIDevice.current.userInterfaceIdiom == .pad {
-            XCUIApplication().tables.buttons.firstMatch.tap()
+            XCUIApplication().tables["Sidebar"].buttons["NavigateToConversion"].tap()
         }
         
-        XCUIApplication().scrollViews.buttons.firstMatch.tap()
-        snapshot("2CurrencySelector\(screnshotEndingName)")
-        
-        XCUIApplication().tables.buttons.element(boundBy: 6).tap()
-        let conversionTextfield = XCUIApplication().textFields.firstMatch
-        conversionTextfield.tap()
-        for _ in (0..<4) {
-            conversionTextfield.typeText(XCUIKeyboardKey.delete.rawValue)
+        let conversionTextField = XCUIApplication().textFields["ConversionTextField"]
+        conversionTextField.tap()
+        conversionTextField.typeText("1030.15\n")
+        snapshot("2Conversion\(screenshotEndingName)")
+    }
+    
+    func testCurrencySelectorScreenshot() throws {
+        if UIDevice.current.userInterfaceIdiom == .pad {
+            XCUIApplication().tables["Sidebar"].buttons["NavigateToConversion"].tap()
         }
         
-        conversionTextfield.typeText("\n")
-        
-        snapshot("3Amount\(screnshotEndingName)")
+        XCUIApplication().scrollViews.buttons["OpenCurrencySelector"].tap()
+        snapshot("3CurrencySelector\(screenshotEndingName)")
     }
     
-    func testFavorites() throws {
-        // Go to favorites
+    func testFavoriteScreenshot() throws {
         if UIDevice.current.userInterfaceIdiom == .pad {
-            XCUIApplication().tables.buttons.element(boundBy: 1).tap()
+            XCUIApplication().tables["Sidebar"].buttons["NavigateToFavorites"].tap()
         } else {
             XCUIApplication().tabBars.buttons.element(boundBy: 1).tap()
         }
-
-        snapshot("4Favorites\(screnshotEndingName)")
+        
+        sleep(1)
+        
+        snapshot("4Favorites\(screenshotEndingName)")
     }
 }
--- a/SimoleonTests/Info.plist	Thu Aug 05 16:50:29 2021 +0100
+++ b/SimoleonTests/Info.plist	Tue Aug 17 22:14:58 2021 +0100
@@ -17,6 +17,6 @@
 	<key>CFBundleShortVersionString</key>
 	<string>1.0</string>
 	<key>CFBundleVersion</key>
-	<string>6</string>
+	<string>1</string>
 </dict>
 </plist>
--- a/SimoleonTests/SimoleonTests.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/SimoleonTests/SimoleonTests.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -17,40 +17,6 @@
     override func tearDownWithError() throws {
         // Put teardown code here. This method is called after the invocation of each test method in the class.
     }
-    
-    func testMakeConversion() {
-        // Given
-        let testAmounts = ["iawuh", Int(100), Float(3450.30), Double(12530.43435)] as [Any]
-        
-        for var amountToConvert in testAmounts {
-            // When
-            if let amountToConvert = amountToConvert as? Double {
-                // Then
-                XCTAssertEqual(amountToConvert, amountToConvert, "Amount to convert is not returning correctly")
-            } else {
-                // Then
-                amountToConvert = Int(0)
-                XCTAssertEqual(amountToConvert as! Int, 0, "Amount to convert must be 0")
-            }
-        }
-    }
-    
-    func testFormatCurrency() {
-        // Given
-        let availableIdentifiers = Locale.availableIdentifiers
-        let amount: NSDecimalNumber = 1000
-        
-        for identifier in availableIdentifiers {
-            let locale = Locale(identifier: identifier)
-            
-            let formatter = NumberFormatter()
-            formatter.locale = locale
-            formatter.numberStyle = .currency
-            
-            XCTAssertTrue((formatter.string(from: amount as NSNumber) != nil))
-        }
-        
-    }
 
     func testPerformanceExample() throws {
         // This is an example of a performance test case.
--- a/SimoleonUITests/Info.plist	Thu Aug 05 16:50:29 2021 +0100
+++ b/SimoleonUITests/Info.plist	Tue Aug 17 22:14:58 2021 +0100
@@ -17,6 +17,6 @@
 	<key>CFBundleShortVersionString</key>
 	<string>1.0</string>
 	<key>CFBundleVersion</key>
-	<string>6</string>
+	<string>1</string>
 </dict>
 </plist>
--- a/SimoleonUITests/SimoleonUITests.swift	Thu Aug 05 16:50:29 2021 +0100
+++ b/SimoleonUITests/SimoleonUITests.swift	Tue Aug 17 22:14:58 2021 +0100
@@ -11,6 +11,12 @@
 
     override func setUpWithError() throws {
         // Put setup code here. This method is called before the invocation of each test method in the class.
+        if UIDevice.current.userInterfaceIdiom == .pad {
+            XCUIDevice.shared.orientation = .landscapeLeft
+        }
+        
+        let app = XCUIApplication()
+        app.launch()
 
         // In UI tests it is usually best to stop immediately when a failure occurs.
         continueAfterFailure = false
@@ -21,7 +27,58 @@
     override func tearDownWithError() throws {
         // Put teardown code here. This method is called after the invocation of each test method in the class.
     }
-
+    
+    func testTabBar() throws {
+        let app = XCUIApplication()
+        if UIDevice.current.userInterfaceIdiom == .pad {
+            app.tables["Sidebar"].buttons["NavigateToConversion"].tap()
+            XCTAssertTrue(app.staticTexts["Convert"].exists)
+            
+            app.tables["Sidebar"].buttons["NavigateToFavorites"].tap()
+            XCTAssertTrue(app.staticTexts["Favorites"].exists)
+            
+            app.tables["Sidebar"].buttons["NavigateToSettings"].tap()
+            XCTAssertTrue(app.staticTexts["Settings"].exists)
+        } else {
+            app.tabBars.buttons.element(boundBy: 0).tap()
+            XCTAssertTrue(app.staticTexts["Convert"].exists)
+            
+            app.tabBars.buttons.element(boundBy: 1).tap()
+            XCTAssertTrue(app.staticTexts["Favorites"].exists)
+            
+            app.tabBars.buttons.element(boundBy: 2).tap()
+            XCTAssertTrue(app.staticTexts["Settings"].exists)
+            
+        }
+    }
+    
+    func testCurrencySelector() throws {
+        let app = XCUIApplication()
+        app.scrollViews.buttons["OpenCurrencySelector"].tap()
+        
+        let currencySearchBar = app.textFields["CurrencySearchBar"]
+        currencySearchBar.tap()
+        currencySearchBar.typeText("USD/BTC")
+        app.tables.buttons["From USD to BTC"].tap()
+    }
+    
+    func testCoreData() throws {
+        let app = XCUIApplication()
+        app.scrollViews.buttons["AddToFavorites"].tap()
+        
+        if UIDevice.current.userInterfaceIdiom == .pad {
+            app.tables["Sidebar"].buttons["NavigateToFavorites"].tap()
+        } else {
+            app.tabBars.buttons.element(boundBy: 1).tap()
+        }
+        
+        XCTAssertTrue(app.tables.buttons["From USD to GBP"].exists)
+        
+        let favoriteList = app.tables
+        favoriteList.buttons["From USD to GBP"].swipeLeft()
+        favoriteList.buttons["Delete"].tap()
+        XCTAssertFalse(app.tables.buttons["From USD to GBP"].exists)
+    }
 
     func testLaunchPerformance() throws {
         if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
--- a/fastlane/Fastfile	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/Fastfile	Tue Aug 17 22:14:58 2021 +0100
@@ -19,11 +19,7 @@
 
   desc "Push a new beta build to TestFlight"
   lane :beta do
-    increment_build_number(
-      build_number: latest_testflight_build_number + 1,
-      xcodeproj: "Simoleon.xcodeproj"
-    )
-    
+    increment_build_number(xcodeproj: "Simoleon.xcodeproj")
     build_app(scheme: "Simoleon")
     upload_to_testflight(
       beta_app_review_info: {
@@ -36,11 +32,17 @@
     )
   end
 
-  desc "Release new version to App Store"
+  desc "Capture screenshots and release version to App Store"
   lane :release do
     capture_screenshots
     build_app(scheme: "Simoleon")
     upload_to_app_store
   end
+
+  desc "Upload to App Store Connect"
+  lane :upload do
+    build_app(scheme: "Simoleon")
+    upload_to_app_store
+  end
   
 end
--- a/fastlane/README.md	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/README.md	Tue Aug 17 22:14:58 2021 +0100
@@ -25,7 +25,12 @@
 ```
 fastlane ios release
 ```
-Release new version to App Store
+Capture screenshots and release version to App Store
+### ios upload
+```
+fastlane ios upload
+```
+Upload to App Store Connect
 
 ----
 
--- a/fastlane/Snapfile	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/Snapfile	Tue Aug 17 22:14:58 2021 +0100
@@ -2,7 +2,8 @@
 devices([
 	"iPhone 8 Plus",
 	"iPhone 12 Pro Max",
-	"iPad Pro (12.9-inch) (5th generation)"
+	"iPad Pro (12.9-inch) (5th generation)",
+	"iPad Pro (12.9-inch) (3rd generation)"
 ])
 
 languages([
@@ -21,7 +22,13 @@
 scheme("Screenshots")
 
 # Enabling this option will automatically uninstall the application before running it.
-# reinstall_app(true)
+reinstall_app(true)
+
+# Enabling this option will automatically erase the simulator before running the application
+# erase_simulator(true)
+
+# Take snapshots on multiple simulators concurrently.
+concurrent_simulators(false)
 
 # Should the project be cleaned before building it?
 clean(true)
--- a/fastlane/metadata/de-DE/release_notes.txt	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/metadata/de-DE/release_notes.txt	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,1 @@
-Hallo zusammen! Dies ist ein großes Update, wir hoffen es gefällt euch:
-- Simoleon ist jetzt in Spanisch, Deutsch, Französisch, Italienisch, Niederländisch, Portugiesisch und Russisch verfügbar. Wenn Sie eine falsche oder seltsame Übersetzung bemerken, kontaktieren Sie uns bitte: https://dennistech.io/contact
-- In-App-Werbekäufe implementiert.
-- Jetzt können Sie mit Simoleon kostenlos zwischen den gängigsten Währungspaaren umrechnen.
-- UI-Aktualisierungen.
-- Behebt Bugs.
\ No newline at end of file
+Wie läuft's denn so? In diesem Update haben wir einige kleinere Fehler behoben und die Benutzeroberfläche verbessert. Nichts Großes, aber sehr wichtige Verbesserungen. Wir sehen uns in der nächsten Version!
\ No newline at end of file
--- a/fastlane/metadata/en-GB/release_notes.txt	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/metadata/en-GB/release_notes.txt	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,1 @@
-Hi there! This is a big update, we hope you like it:
-- Simoleon is available in Spanish, German, French, Italian, Dutch, Portuguese, and Russian. If you notice a wrong or weird translation, please contact us: https://dennistech.io/contact
-- Implemented In-App promotional purchases.
-- Now, you can use Simoleon to convert between the most popular currency pairs for free.
-- UI updates.
-- Fixes bugs.
\ No newline at end of file
+How's everything going? In this update we fixed some minor bugs and improved the UX. Nothing big but very important improvements. See you in the next version!
\ No newline at end of file
--- a/fastlane/metadata/en-US/release_notes.txt	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/metadata/en-US/release_notes.txt	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,1 @@
-Hi there! This is a big update, we hope you like it:
-- Simoleon is available in Spanish, German, French, Italian, Dutch, Portuguese, and Russian. If you notice a wrong or weird translation, please contact us: https://dennistech.io/contact
-- Implemented In-App promotional purchases.
-- Now, you can use Simoleon to convert between the most popular currency pairs for free.
-- UI updates.
-- Fixes bugs.
\ No newline at end of file
+How's everything going? In this update we fixed some minor bugs and improved the UX. Nothing big but very important improvements. See you in the next version!
\ No newline at end of file
--- a/fastlane/metadata/es-ES/release_notes.txt	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/metadata/es-ES/release_notes.txt	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,1 @@
-¡Hola! Esta es la actualización más importante hasta el momento. Esperamos que te guste:
-- Simoleon está disponible es español, alemán, francés, italiano, holandés, portugués, y ruso. Si ves alguna tradución equivocada o rara, por favor contáctanos: https://dennistech.io/contact
-- Ya puedes comprar la suscripción directamente desde la App Store.
-- Ahora puede convertir entre las divisas más populares gratuitamente.
-- Mejoras en la interfaz.
-- Arreglo de bugs.
\ No newline at end of file
+¿Cómo va todo? En esta actualización hemos corregido algunos errores menores y mejorado la UX. Nada grande pero son mejoras muy importantes. ¡Nos vemos en la próxima versión!
\ No newline at end of file
--- a/fastlane/metadata/fr-FR/release_notes.txt	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/metadata/fr-FR/release_notes.txt	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,1 @@
-Bonjour à tous ! C'est une grosse mise à jour, nous espérons qu'elle vous plaira :
-- Simoleon est disponible en espagnol, allemand, français, italien, néerlandais, portugais et russe. Si vous remarquez une traduction erronée ou bizarre, veuillez nous contacter : https://dennistech.io/contact.
-- Mise en place des achats promotionnels In-App.
-- Désormais, vous pouvez utiliser Simoleon pour convertir gratuitement les paires de devises les plus populaires.
-- Mises à jour de l'interface utilisateur.
-- Correction de bugs.
\ No newline at end of file
+Comment ça se passe ? Dans cette mise à jour, nous avons corrigé quelques bugs mineurs et amélioré l'interface utilisateur. Rien de gros mais des améliorations très importantes. A bientôt dans la prochaine version!
\ No newline at end of file
--- a/fastlane/metadata/it/release_notes.txt	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/metadata/it/release_notes.txt	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,1 @@
-Ciao a tutti! Questo è un grande aggiornamento, speriamo che vi piaccia:
-- Simoleon è disponibile in spagnolo, tedesco, francese, italiano, olandese, portoghese e russo. Se noti una traduzione sbagliata o strana, contattaci: https://dennistech.io/contact
-- Implementati gli acquisti promozionali In-App.
-- Ora, è possibile utilizzare Simoleon per convertire tra le coppie di valute più popolari gratuitamente.
-- Aggiornamenti dell'interfaccia utente.
-- Correzione di bug.
\ No newline at end of file
+Come vanno le cose? In questo aggiornamento abbiamo risolto alcuni bug minori e migliorato l'UX. Niente di che, ma miglioramenti molto importanti. Ci vediamo nella prossima versione!
\ No newline at end of file
--- a/fastlane/metadata/nl-NL/release_notes.txt	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/metadata/nl-NL/release_notes.txt	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,1 @@
-Hallo daar! Dit is een grote update, we hopen dat jullie het leuk vinden:
-- Simoleon is beschikbaar in het Spaans, Duits, Frans, Italiaans, Nederlands, Portugees, en Russisch. Als u een verkeerde of vreemde vertaling opmerkt, neem dan contact met ons op: https://dennistech.io/contact
-- Geïmplementeerde In-App promotionele aankopen.
-- Nu kun je Simoleon gebruiken om gratis om te rekenen tussen de meest populaire valuta paren.
-- UI updates.
-- Bugs opgelost.
\ No newline at end of file
+Hoe gaat het met alles? In deze update hebben we wat kleine bugs verholpen en de UX verbeterd. Niets groots, maar zeer belangrijke verbeteringen. Tot ziens in de volgende versie!
\ No newline at end of file
--- a/fastlane/metadata/pt-PT/release_notes.txt	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/metadata/pt-PT/release_notes.txt	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,1 @@
-Olá! Esta é uma grande actualização, esperamos que gostem:
-- Simoleon está disponível em espanhol, alemão, francês, italiano, holandês, português, e russo. Se notar uma tradução errada ou estranha, por favor contacte-nos: https://dennistech.io/contact
-- Compras promocionais implementadas In-App.
-- Agora, pode usar o Simoleon para converter entre os pares de moedas mais populares gratuitamente.
-- Actualizações UI.
-- Corrige bugs.
\ No newline at end of file
+Como está tudo a correr? Nesta actualização corrigimos alguns bugs menores e melhorámos o UX. Nada de grande mas melhorias muito importantes. Vejo-vos na próxima versão!
\ No newline at end of file
--- a/fastlane/metadata/ru/release_notes.txt	Thu Aug 05 16:50:29 2021 +0100
+++ b/fastlane/metadata/ru/release_notes.txt	Tue Aug 17 22:14:58 2021 +0100
@@ -1,6 +1,1 @@
-Привет! Это большое обновление, мы надеемся, что оно вам понравится:
-- Simoleon доступен на испанском, немецком, французском, итальянском, голландском, португальском и русском языках. Если вы заметили неправильный или странный перевод, пожалуйста, свяжитесь с нами: https://dennistech.io/contact.
-- Внедрены рекламные покупки In-App.
-- Теперь вы можете использовать Simoleon для конвертации между самыми популярными валютными парами бесплатно.
-- Обновления пользовательского интерфейса.
-- Исправлены ошибки.
\ No newline at end of file
+Как идут дела? В этом обновлении мы исправили несколько мелких ошибок и улучшили UX. Ничего особенного, но очень важные улучшения. Увидимся в следующей версии!
\ No newline at end of file