214 lines
6.5 KiB
Bash
Executable File
214 lines
6.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Portfolio Journal Test Runner
|
|
# Usage: ./Scripts/run_tests.sh [options]
|
|
#
|
|
# Options:
|
|
# --unit Run unit tests only (default)
|
|
# --ui Run UI tests only
|
|
# --all Run all tests
|
|
# --coverage Generate code coverage report
|
|
# --device Specify simulator device (default: iPhone 17)
|
|
# --help Show this help message
|
|
|
|
set -e
|
|
|
|
# Configuration
|
|
PROJECT_PATH="PortfolioJournal.xcodeproj"
|
|
SCHEME="PortfolioJournal"
|
|
DEFAULT_DEVICE="iPhone 17"
|
|
DERIVED_DATA_PATH="$HOME/Library/Developer/Xcode/DerivedData/PortfolioJournal-Tests"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Parse arguments
|
|
RUN_UNIT=true
|
|
RUN_UI=false
|
|
COVERAGE=false
|
|
DEVICE="$DEFAULT_DEVICE"
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--unit)
|
|
RUN_UNIT=true
|
|
RUN_UI=false
|
|
shift
|
|
;;
|
|
--ui)
|
|
RUN_UNIT=false
|
|
RUN_UI=true
|
|
shift
|
|
;;
|
|
--all)
|
|
RUN_UNIT=true
|
|
RUN_UI=true
|
|
shift
|
|
;;
|
|
--coverage)
|
|
COVERAGE=true
|
|
shift
|
|
;;
|
|
--device)
|
|
DEVICE="$2"
|
|
shift 2
|
|
;;
|
|
--help|-h)
|
|
echo "Portfolio Journal Test Runner"
|
|
echo ""
|
|
echo "Usage: ./Scripts/run_tests.sh [options]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --unit Run unit tests only (default)"
|
|
echo " --ui Run UI tests only"
|
|
echo " --all Run all tests"
|
|
echo " --coverage Generate code coverage report"
|
|
echo " --device Specify simulator device (default: iPhone 17)"
|
|
echo " --help Show this help message"
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Print banner
|
|
echo -e "${BLUE}"
|
|
echo "╔══════════════════════════════════════════╗"
|
|
echo "║ Portfolio Journal Test Runner ║"
|
|
echo "╚══════════════════════════════════════════╝"
|
|
echo -e "${NC}"
|
|
|
|
# Check if project exists
|
|
if [ ! -d "$PROJECT_PATH" ]; then
|
|
echo -e "${RED}Error: Project not found at $PROJECT_PATH${NC}"
|
|
echo "Make sure you're running this script from the project root directory."
|
|
exit 1
|
|
fi
|
|
|
|
# Build test arguments
|
|
BUILD_ARGS=(
|
|
-project "$PROJECT_PATH"
|
|
-scheme "$SCHEME"
|
|
-destination "platform=iOS Simulator,name=$DEVICE"
|
|
-derivedDataPath "$DERIVED_DATA_PATH"
|
|
)
|
|
|
|
if [ "$COVERAGE" = true ]; then
|
|
BUILD_ARGS+=(-enableCodeCoverage YES)
|
|
fi
|
|
|
|
# Function to run tests
|
|
run_tests() {
|
|
local test_type=$1
|
|
local test_target=$2
|
|
|
|
echo -e "${YELLOW}Running $test_type tests...${NC}"
|
|
echo "Device: $DEVICE"
|
|
echo ""
|
|
|
|
if xcodebuild test "${BUILD_ARGS[@]}" -only-testing:"$test_target" 2>&1 | xcpretty --color; then
|
|
echo -e "${GREEN}✅ $test_type tests passed!${NC}"
|
|
return 0
|
|
else
|
|
echo -e "${RED}❌ $test_type tests failed!${NC}"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Function to run all tests without filtering
|
|
run_all_tests() {
|
|
echo -e "${YELLOW}Running all tests...${NC}"
|
|
echo "Device: $DEVICE"
|
|
echo ""
|
|
|
|
if xcodebuild test "${BUILD_ARGS[@]}" 2>&1 | xcpretty --color; then
|
|
echo -e "${GREEN}✅ All tests passed!${NC}"
|
|
return 0
|
|
else
|
|
echo -e "${RED}❌ Some tests failed!${NC}"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Check if xcpretty is available
|
|
if ! command -v xcpretty &> /dev/null; then
|
|
echo -e "${YELLOW}Warning: xcpretty not found. Install with: gem install xcpretty${NC}"
|
|
echo "Running tests without pretty output..."
|
|
echo ""
|
|
|
|
# Run without xcpretty
|
|
run_tests_raw() {
|
|
if [ "$RUN_UNIT" = true ] && [ "$RUN_UI" = true ]; then
|
|
xcodebuild test "${BUILD_ARGS[@]}"
|
|
elif [ "$RUN_UNIT" = true ]; then
|
|
xcodebuild test "${BUILD_ARGS[@]}" -only-testing:PortfolioJournalTests
|
|
elif [ "$RUN_UI" = true ]; then
|
|
xcodebuild test "${BUILD_ARGS[@]}" -only-testing:PortfolioJournalUITests
|
|
fi
|
|
}
|
|
|
|
if run_tests_raw; then
|
|
echo -e "${GREEN}✅ Tests passed!${NC}"
|
|
exit 0
|
|
else
|
|
echo -e "${RED}❌ Tests failed!${NC}"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# Run tests
|
|
EXIT_CODE=0
|
|
|
|
if [ "$RUN_UNIT" = true ] && [ "$RUN_UI" = true ]; then
|
|
run_all_tests || EXIT_CODE=1
|
|
elif [ "$RUN_UNIT" = true ]; then
|
|
run_tests "Unit" "PortfolioJournalTests" || EXIT_CODE=1
|
|
elif [ "$RUN_UI" = true ]; then
|
|
run_tests "UI" "PortfolioJournalUITests" || EXIT_CODE=1
|
|
fi
|
|
|
|
# Generate coverage report if requested
|
|
if [ "$COVERAGE" = true ] && [ $EXIT_CODE -eq 0 ]; then
|
|
echo ""
|
|
echo -e "${YELLOW}Generating code coverage report...${NC}"
|
|
|
|
COVERAGE_PATH="$DERIVED_DATA_PATH/Build/ProfileData"
|
|
|
|
if [ -d "$COVERAGE_PATH" ]; then
|
|
# Find the profdata file
|
|
PROFDATA=$(find "$COVERAGE_PATH" -name "*.profdata" | head -1)
|
|
|
|
if [ -n "$PROFDATA" ]; then
|
|
echo "Coverage data found at: $PROFDATA"
|
|
echo ""
|
|
echo "To view detailed coverage:"
|
|
echo " xcrun llvm-cov report \\"
|
|
echo " \"$DERIVED_DATA_PATH/Build/Products/Debug-iphonesimulator/PortfolioJournal.app/PortfolioJournal\" \\"
|
|
echo " -instr-profile=\"$PROFDATA\""
|
|
else
|
|
echo -e "${YELLOW}No coverage data found. Make sure tests ran successfully.${NC}"
|
|
fi
|
|
else
|
|
echo -e "${YELLOW}Coverage directory not found.${NC}"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
if [ $EXIT_CODE -eq 0 ]; then
|
|
echo -e "${GREEN}════════════════════════════════════════════${NC}"
|
|
echo -e "${GREEN} All tests completed successfully! 🎉 ${NC}"
|
|
echo -e "${GREEN}════════════════════════════════════════════${NC}"
|
|
else
|
|
echo -e "${RED}════════════════════════════════════════════${NC}"
|
|
echo -e "${RED} Some tests failed. Please review above. ${NC}"
|
|
echo -e "${RED}════════════════════════════════════════════${NC}"
|
|
fi
|
|
|
|
exit $EXIT_CODE
|