catalyst-core 0.3.0-beta.5 → 0.3.0-canary.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +185 -71
- package/dist/errors/generateDocs.js +100 -0
- package/dist/errors/index.js +243 -0
- package/dist/errors/registry.js +483 -0
- package/dist/errors-index.json +506 -0
- package/dist/globals.d.ts +62 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.jsx +5 -8
- package/dist/logger.js +1 -1
- package/dist/native/androidProject/app/build.gradle.kts +142 -7
- package/dist/native/androidProject/app/src/main/AndroidManifest.xml +4 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/NativeBridge.kt +2 -2
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/camera/BarcodeDetector.kt +3 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/camera/CameraSessionManager.kt +3 -0
- package/dist/native/androidProject/app/src/main/java/io/yourname/androidproject/utils/FrameworkServerUtils.kt +43 -8
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/BridgeUtilsTest.kt +181 -1
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/CameraUtilsTest.kt +156 -236
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/FileSizeRouterUtilsTest.kt +471 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/FileUtilsTest.kt +222 -226
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/FrameworkServerUtilsTest.kt +300 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/IntentUtilsTest.kt +244 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/MetricsMonitorTest.kt +359 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/NativeBridgeTest.kt +108 -63
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/NotificationUtilsTest.kt +329 -385
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/OfflineCacheServiceTest.kt +302 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/PerfEventBufferTest.kt +133 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/UtilsKtTest.kt +152 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/WebCacheManagerTest.kt +145 -324
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/BarcodeDetectorTest.kt +132 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/HoldControllerTest.kt +155 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/TorchControllerTest.kt +150 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/VideoStreamStateMachineTest.kt +120 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/VideoStreamStateTest.kt +62 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/ViewfinderMapperTest.kt +143 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/camera/ZoomControllerTest.kt +421 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/design/DesignTokensTest.kt +207 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/plugins/PluginBridgeTest.kt +368 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/security/FridaDetectorTest.kt +193 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/security/SecurityCheckManagerTest.kt +260 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/security/SecurityCheckSchedulerTest.kt +166 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/DeviceInfoUtilsTest.kt +167 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/DownloadUtilsTest.kt +197 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/NetworkMonitorTest.kt +271 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/PushNotificationUtilsTest.kt +119 -0
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/utils/SafeAreaUtilsTest.kt +108 -0
- package/dist/native/androidProject/build.gradle.kts +1 -0
- package/dist/native/androidProject/gradle/libs.versions.toml +26 -0
- package/dist/native/androidProject/settings.gradle.kts +11 -8
- package/dist/native/androidSetup.js +2 -2
- package/dist/native/bridge/WebBridge.d.ts +98 -0
- package/dist/native/bridge/WebBridge.js +40 -6
- package/dist/native/bridge/constants/NativeInterfaces.d.ts +391 -0
- package/dist/native/bridge/errors.d.ts +67 -0
- package/dist/native/bridge/errors.js +66 -151
- package/dist/native/bridge/hooks/index.d.ts +13 -0
- package/dist/native/bridge/hooks/index.js +0 -6
- package/dist/native/bridge/hooks/useAI.d.ts +1 -0
- package/dist/native/bridge/hooks/useAI.js +3 -1
- package/dist/native/bridge/hooks/useCamera.d.ts +86 -0
- package/dist/native/bridge/hooks/useCamera.js +35 -6
- package/dist/native/bridge/hooks/useDataProtection.d.ts +17 -0
- package/dist/native/bridge/hooks/useDeviceInfo.d.ts +34 -0
- package/dist/native/bridge/hooks/useDeviceInfo.js +5 -0
- package/dist/native/bridge/hooks/useFilePicker.d.ts +53 -0
- package/dist/native/bridge/hooks/useFilePicker.js +13 -0
- package/dist/native/bridge/hooks/useGoogleSignIn.d.ts +12 -0
- package/dist/native/bridge/hooks/useHapticFeedback.d.ts +76 -0
- package/dist/native/bridge/hooks/useHapticFeedback.js +6 -1
- package/dist/native/bridge/hooks/useIntent.d.ts +33 -0
- package/dist/native/bridge/hooks/useIntent.js +2 -0
- package/dist/native/bridge/hooks/useNativeTransition.d.ts +53 -0
- package/dist/native/bridge/hooks/useNativeTransition.js +12 -5
- package/dist/native/bridge/hooks/useNetworkStatus.d.ts +22 -0
- package/dist/native/bridge/hooks/useNetworkStatus.js +7 -0
- package/dist/native/bridge/hooks/useNotification.d.ts +83 -0
- package/dist/native/bridge/hooks/useNotification.js +81 -34
- package/dist/native/bridge/hooks/useSafeArea.d.ts +12 -0
- package/dist/native/bridge/hooks/useSafeArea.js +8 -0
- package/dist/native/bridge/hooks/useVideoStream.d.ts +67 -0
- package/dist/native/bridge/hooks/useVideoStream.js +38 -52
- package/dist/native/bridge/hooks/utils.d.ts +4 -0
- package/dist/native/bridge/hooks.d.ts +1 -0
- package/dist/native/bridge/perf/collectors/ApiCollector.d.ts +30 -0
- package/dist/native/bridge/perf/collectors/ApiCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/CacheCollector.d.ts +43 -0
- package/dist/native/bridge/perf/collectors/CacheCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/HookCollector.d.ts +37 -0
- package/dist/native/bridge/perf/collectors/HookCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/InsightsCollector.d.ts +103 -0
- package/dist/native/bridge/perf/collectors/InsightsCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/InteractionCollector.d.ts +53 -0
- package/dist/native/bridge/perf/collectors/InteractionCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/KeyboardCollector.d.ts +30 -0
- package/dist/native/bridge/perf/collectors/KeyboardCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/NavigationCollector.d.ts +37 -0
- package/dist/native/bridge/perf/collectors/NavigationCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/NetworkTimingCollector.d.ts +30 -0
- package/dist/native/bridge/perf/collectors/NetworkTimingCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/RenderCollector.d.ts +47 -0
- package/dist/native/bridge/perf/collectors/RenderCollector.js +8 -0
- package/dist/native/bridge/perf/collectors/ScrollCollector.d.ts +29 -0
- package/dist/native/bridge/perf/collectors/ScrollCollector.js +4 -0
- package/dist/native/bridge/perf/collectors/ThreadCollector.d.ts +31 -0
- package/dist/native/bridge/perf/collectors/ThreadCollector.js +4 -0
- package/dist/native/bridge/perf/core/constants.d.ts +76 -0
- package/dist/native/bridge/perf/core/measure.d.ts +39 -0
- package/dist/native/bridge/perf/core/measure.js +4 -0
- package/dist/native/bridge/perf/core/session.d.ts +49 -0
- package/dist/native/bridge/perf/core/session.js +4 -0
- package/dist/native/bridge/perf/core/store.d.ts +37 -0
- package/dist/native/bridge/perf/core/store.js +4 -0
- package/dist/native/bridge/perf/core/summary.d.ts +60 -0
- package/dist/native/bridge/perf/core/traceExport.d.ts +10 -0
- package/dist/native/bridge/perf/core/waterfalls.d.ts +2 -0
- package/dist/native/bridge/perf/index.d.ts +63 -0
- package/dist/native/bridge/perf/index.js +4 -0
- package/dist/native/bridge/safeArea.d.ts +11 -0
- package/dist/native/bridge/safeArea.js +2 -0
- package/dist/native/bridge/useBaseHook.d.ts +137 -0
- package/dist/native/bridge/useBaseHook.js +34 -4
- package/dist/native/bridge/utils/CameraUtils.d.ts +94 -0
- package/dist/native/bridge/utils/CameraUtils.js +4 -0
- package/dist/native/bridge/utils/FileObjectConverter.d.ts +36 -0
- package/dist/native/bridge/utils/NativeBridge.d.ts +270 -0
- package/dist/native/bridge/utils/NativeBridge.js +10 -0
- package/dist/native/buildAndroid/index.js +1 -1
- package/dist/native/buildAppAndroid.js +9 -0
- package/dist/native/buildAppIos.js +16 -1
- package/dist/native/buildErrorFormat.js +57 -0
- package/dist/native/buildIos/config.js +15 -1
- package/dist/native/buildIos/index.js +1 -1
- package/dist/native/buildIos/plugins.js +10 -1
- package/dist/native/iosnativeWebView/CoreLogic/Package.swift +36 -0
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Camera/VideoStreamState.swift +1 -1
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Camera/VideoStreamStateMachine.swift +6 -4
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/BootTimingUtility.swift +3 -3
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/FrameworkServerUtils.swift +14 -9
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/NetworkMonitor.swift +11 -9
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/NotificationHandlerProvider.swift +1 -1
- package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/URLWhitelistManager.swift +7 -7
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/AnyCodableTests.swift +154 -0
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/BootTimingUtilityTests.swift +23 -5
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/CatalystConstantsTests.swift +192 -0
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/ConfigMappingTests.swift +1 -1
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/FrameworkServerUtilsErrorPathTests.swift +106 -0
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/FrameworkServerUtilsLoopbackTests.swift +243 -0
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/FrameworkServerUtilsTests.swift +1 -1
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/NetworkMonitorTests.swift +119 -0
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/NotificationHandlerProviderTests.swift +59 -0
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/NotificationHandlerTests.swift +1 -1
- package/dist/native/iosnativeWebView/{iosnativeWebViewTests → CoreLogic/Tests/CatalystCoreLogicTests}/URLWhitelistManagerTests.swift +1 -1
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/VideoStreamStateMachineTests.swift +171 -0
- package/dist/native/iosnativeWebView/CoreLogic/Tests/CatalystCoreLogicTests/VideoStreamStateTests.swift +91 -0
- package/dist/native/iosnativeWebView/Package.swift +10 -9
- package/dist/native/iosnativeWebView/Sources/CatalystNotifications/LocalNotificationHandler.swift +7 -2
- package/dist/native/iosnativeWebView/Sources/CatalystNotifications/NotificationManager.swift +1 -2
- package/dist/native/iosnativeWebView/Sources/CatalystNotifications/PushNotificationHandler.swift +5 -4
- package/dist/native/iosnativeWebView/Sources/Core/Camera/CameraSessionManager.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Camera/HoldController.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Camera/NativeCameraManager.swift +6 -5
- package/dist/native/iosnativeWebView/Sources/Core/Camera/ZoomController.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Plugins/PluginBridge.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/CacheManager.swift +31 -30
- package/dist/native/iosnativeWebView/Sources/Core/Utils/CameraTransportUtils.swift +2 -1
- package/dist/native/iosnativeWebView/Sources/Core/Utils/DeviceInfoUtils.swift +1 -1
- package/dist/native/iosnativeWebView/Sources/Core/Utils/FilePickerHandler.swift +22 -19
- package/dist/native/iosnativeWebView/Sources/Core/Utils/ImageHandler.swift +40 -39
- package/dist/native/iosnativeWebView/Sources/Core/Utils/PerfEventBuffer.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/Utils/ResourceURLProtocol.swift +15 -15
- package/dist/native/iosnativeWebView/Sources/Core/Utils/WebKitConfig.swift +4 -3
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeCommandHandler.swift +6 -1
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeDelegateHandler.swift +1 -0
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeFileHandler.swift +2 -1
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeJavaScriptInterface.swift +2 -1
- package/dist/native/iosnativeWebView/Sources/Core/WebView/BridgeMessageValidator.swift +3 -5
- package/dist/native/iosnativeWebView/Sources/Core/WebView/NativeBridge.swift +20 -13
- package/dist/native/iosnativeWebView/Sources/Core/WebView/SplashView.swift +6 -5
- package/dist/native/iosnativeWebView/Sources/Core/WebView/SplashViewModel.swift +14 -13
- package/dist/native/iosnativeWebView/Sources/Core/WebView/TransitionManager.swift +3 -3
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebView.swift +9 -8
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebViewModel.swift +7 -6
- package/dist/native/iosnativeWebView/Sources/Core/WebView/WebViewNavigationDelegate.swift +24 -25
- package/dist/native/iosnativeWebView/iosnativeWebView/AppDelegate.swift +6 -1
- package/dist/native/iosnativeWebView/iosnativeWebView/ContentView.swift +1 -0
- package/dist/native/iosnativeWebView/iosnativeWebView/iosnativeWebViewApp.swift +4 -0
- package/dist/native/iosnativeWebView/iosnativeWebView.xcodeproj/project.pbxproj +2 -22
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/BridgeMessageValidatorTests.swift +1 -0
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/CacheManagerTests.swift +1 -0
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/FilePickerHandlerTests.swift +2 -1
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/NativeBridgeTests.swift +15 -9
- package/dist/native/iosnativeWebView/iosnativeWebViewTests/WebViewTests.swift +1 -0
- package/dist/native/setupEmulatorIos.js +2 -2
- package/dist/native/terminalProgress.js +17 -17
- package/dist/router/ClientRouter.d.ts +8 -0
- package/dist/router/ClientRouter.js +13 -11
- package/dist/router/ServerRouter.d.ts +13 -0
- package/dist/router/ServerRouter.js +19 -7
- package/dist/scripts/build.js +14 -2
- package/dist/scripts/loadEnvironmentVariables.js +3 -2
- package/dist/scripts/plugins.js +1 -1
- package/dist/scripts/preServerInit.js +49 -3
- package/dist/scripts/preflight.js +111 -0
- package/dist/scripts/scriptUtils.js +46 -1
- package/dist/scripts/serve.js +7 -3
- package/dist/scripts/start.js +8 -3
- package/dist/server/expressServer.d.ts +1 -0
- package/dist/server/expressServer.js +247 -271
- package/dist/server/manifestCache.d.ts +2 -0
- package/dist/server/manifestCache.js +25 -33
- package/dist/server/renderer/ChunkExtractor.d.ts +44 -0
- package/dist/server/renderer/ChunkExtractor.js +113 -125
- package/dist/server/renderer/document/Body.d.ts +21 -0
- package/dist/server/renderer/document/Body.jsx +45 -45
- package/dist/server/renderer/document/FastRefresh.d.ts +3 -0
- package/dist/server/renderer/document/FastRefresh.jsx +7 -13
- package/dist/server/renderer/document/Head.d.ts +20 -0
- package/dist/server/renderer/document/Head.jsx +32 -32
- package/dist/server/renderer/document/index.d.ts +2 -0
- package/dist/server/renderer/document/index.jsx +2 -2
- package/dist/server/renderer/extract.d.ts +67 -0
- package/dist/server/renderer/extract.js +92 -89
- package/dist/server/renderer/handler.d.ts +2 -0
- package/dist/server/renderer/handler.jsx +401 -404
- package/dist/server/renderer/index.d.ts +2 -0
- package/dist/server/renderer/index.js +5 -8
- package/dist/server/renderer/render.d.ts +35 -0
- package/dist/server/renderer/render.js +25 -32
- package/dist/server/utils/botDetectionMiddleware.d.ts +1 -0
- package/dist/server/utils/botDetectionMiddleware.js +33 -23
- package/dist/server/utils/cjsRequire.d.ts +8 -0
- package/dist/server/utils/cjsRequire.js +2 -2
- package/dist/server/utils/userAgentUtil.d.ts +7 -0
- package/dist/server/utils/userAgentUtil.js +68 -71
- package/dist/server/utils/validator.d.ts +31 -0
- package/dist/server/utils/validator.js +133 -158
- package/dist/vite/inject-cache-key-plugin.js +3 -27
- package/dist/vite/moduleAliases.js +36 -0
- package/dist/vite/node-loader.mjs +2 -29
- package/dist/vite/resolveDevServerConfig.js +4 -1
- package/dist/vite/vite.config.js +2 -29
- package/dist/web-router/components/MetaTag.d.ts +4 -0
- package/dist/web-router/components/MetaTag.jsx +26 -28
- package/dist/web-router/components/MetaTag.test.jsx +100 -0
- package/dist/web-router/components/RouterDataProvider.d.ts +96 -0
- package/dist/web-router/components/RouterDataProvider.jsx +260 -259
- package/dist/web-router/components/RouterDataProvider.server.test.jsx +98 -0
- package/dist/web-router/components/RouterDataProvider.test.jsx +310 -0
- package/dist/web-router/components/Split.d.ts +74 -0
- package/dist/web-router/components/Split.jsx +147 -156
- package/dist/web-router/components/Split.server.test.jsx +52 -0
- package/dist/web-router/components/Split.test.jsx +167 -0
- package/dist/web-router/components/SplitInview.d.ts +22 -0
- package/dist/web-router/components/SplitInview.jsx +78 -89
- package/dist/web-router/components/SplitInview.test.jsx +112 -0
- package/dist/web-router/components/SsrRequestContext.d.ts +20 -0
- package/dist/web-router/components/SsrRequestContext.jsx +17 -7
- package/dist/web-router/components/SsrRequestContext.test.jsx +53 -0
- package/dist/web-router/context.d.ts +15 -0
- package/dist/web-router/context.jsx +5 -5
- package/dist/web-router/context.test.jsx +10 -0
- package/dist/web-router/utils/metaDataUtils.d.ts +24 -0
- package/dist/web-router/utils/metaDataUtils.jsx +86 -86
- package/dist/web-router/utils/metaDataUtils.test.jsx +188 -0
- package/dist/web-router/vitest.setup.js +12 -0
- package/mcp_v2/knowledge-base.json +115 -17
- package/mcp_v2/mcp.js +141 -3
- package/mcp_v2/package-lock.json +2031 -0
- package/mcp_v2/package.json +13 -2
- package/mcp_v2/scripts/copyErrorsIndex.cjs +34 -0
- package/mcp_v2/test/errors.test.ts +123 -0
- package/mcp_v2/test/github.test.ts +177 -0
- package/mcp_v2/tools/errors.d.ts +20 -0
- package/mcp_v2/tools/errors.js +63 -0
- package/mcp_v2/tools/github.d.ts +41 -0
- package/mcp_v2/tools/github.js +231 -0
- package/mcp_v2/vitest.config.mjs +22 -0
- package/package.json +60 -11
- package/test/errors/docsDrift.test.ts +113 -0
- package/test/errors/index.test.ts +200 -0
- package/test/errors/registry.test.ts +108 -0
- package/test/scripts/preflight.test.ts +118 -0
- package/test/server/ChunkExtractor.test.ts +97 -0
- package/test/server/extract.test.ts +128 -0
- package/test/server/fixtures/template/server/document.jsx +19 -0
- package/test/server/fixtures/template/server/index.js +10 -0
- package/test/server/fixtures/template/src/js/containers/App/index.jsx +33 -0
- package/test/server/fixtures/template/src/js/routes/index.jsx +72 -0
- package/test/server/fixtures/template/src/js/routes/utils.jsx +39 -0
- package/test/server/fixtures/template/src/js/store/index.js +19 -0
- package/test/server/handler.assets.test.ts +330 -0
- package/test/server/handler.test.ts +208 -0
- package/test/server/manifestCache.test.ts +71 -0
- package/test/server/render.test.ts +71 -0
- package/test/server/scriptUtils.test.ts +103 -0
- package/test/server/userAgentUtil.test.ts +48 -0
- package/test/server/validator.test.ts +225 -0
- package/test/vite/resolveDevServerConfig.test.js +4 -1
- package/tsconfig.test.json +23 -0
- package/vitest.config.ts +93 -0
- package/dist/caching.js +0 -1
- package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/DeviceInfoUtilsTest.kt +0 -187
- package/dist/native/bridge/standardizedHooks.js +0 -611
- package/dist/router.js +0 -1
- package/dist/scripts/validator.js +0 -149
- package/dist/web-router/hooks.jsx +0 -72
- package/dist/web-router/types/components/MetaTag.d.ts +0 -2
- package/dist/web-router/types/components/RouterDataProvider.d.ts +0 -95
- package/dist/web-router/types/context.d.ts +0 -14
- package/dist/web-router/types/hooks.d.ts +0 -1
- package/dist/web-router/types/index.d.ts +0 -3
- package/dist/web-router/types/utils/metaDataUtils.d.ts +0 -40
- /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Constants/CatalystConstants.swift +0 -0
- /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Constants/ConfigConstants.swift +0 -0
- /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Notifications/NotificationModels.swift +0 -0
- /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Protocols/NotificationHandlerProtocol.swift +0 -0
- /package/dist/native/iosnativeWebView/{Sources/Core → CoreLogic/Sources/CatalystCoreLogic}/Utils/NullNotificationHandler.swift +0 -0
package/dist/native/androidProject/app/src/test/java/io/yourname/androidproject/CameraUtilsTest.kt
CHANGED
|
@@ -1,296 +1,216 @@
|
|
|
1
1
|
package io.yourname.androidproject
|
|
2
2
|
|
|
3
|
+
import android.app.Activity
|
|
4
|
+
import android.content.pm.PackageManager
|
|
5
|
+
import android.os.Environment
|
|
6
|
+
import androidx.core.content.ContextCompat
|
|
3
7
|
import io.yourname.androidproject.utils.CameraUtils
|
|
8
|
+
import org.junit.After
|
|
4
9
|
import org.junit.Assert.*
|
|
10
|
+
import org.junit.Before
|
|
5
11
|
import org.junit.Test
|
|
6
|
-
import
|
|
7
|
-
import
|
|
12
|
+
import org.mockito.MockedStatic
|
|
13
|
+
import org.mockito.Mockito.mockStatic
|
|
14
|
+
import org.mockito.kotlin.any
|
|
15
|
+
import org.mockito.kotlin.doReturn
|
|
16
|
+
import org.mockito.kotlin.mock
|
|
17
|
+
import org.mockito.kotlin.whenever
|
|
18
|
+
import java.io.File
|
|
19
|
+
import kotlin.io.path.createTempDirectory
|
|
8
20
|
|
|
9
21
|
/**
|
|
10
|
-
* Unit tests for CameraUtils
|
|
22
|
+
* Unit tests for CameraUtils.
|
|
11
23
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
24
|
+
* The previous version of this file imported CameraUtils but never called
|
|
25
|
+
* a single method on it — every assertion was against hand-reimplemented
|
|
26
|
+
* logic (a locally constructed SimpleDateFormat, a locally built filename
|
|
27
|
+
* string) instead of the real class, so it passed while contributing 0%
|
|
28
|
+
* coverage. Rewritten to call CameraUtils directly, following the
|
|
29
|
+
* mockStatic(...) + mocked Activity pattern established in
|
|
30
|
+
* OfflineCacheServiceTest.kt for Context/Android-stub-bound classes.
|
|
17
31
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
32
|
+
* ContextCompat.checkSelfPermission and Environment.getExternalStorageState
|
|
33
|
+
* are static Android SDK calls with no real implementation in a JVM unit
|
|
34
|
+
* test (the stub jar throws/returns defaults) — mocked statically here so
|
|
35
|
+
* hasCameraPermission/getPermissionStatus/validateCameraRequirements
|
|
36
|
+
* exercise CameraUtils' actual branching logic against controlled inputs.
|
|
22
37
|
*/
|
|
23
38
|
class CameraUtilsTest {
|
|
24
39
|
|
|
40
|
+
private lateinit var activity: Activity
|
|
41
|
+
private lateinit var picturesDir: File
|
|
42
|
+
private lateinit var contextCompatMock: MockedStatic<ContextCompat>
|
|
43
|
+
private lateinit var environmentMock: MockedStatic<Environment>
|
|
44
|
+
|
|
45
|
+
@Before
|
|
46
|
+
fun setUp() {
|
|
47
|
+
picturesDir = createTempDirectory(prefix = "catalyst-camera-test").toFile()
|
|
48
|
+
activity = mock {
|
|
49
|
+
on { getExternalFilesDir(Environment.DIRECTORY_PICTURES) } doReturn picturesDir
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
contextCompatMock = mockStatic(ContextCompat::class.java)
|
|
53
|
+
environmentMock = mockStatic(Environment::class.java)
|
|
54
|
+
// getExternalStorageState() is a real method on the mocked static
|
|
55
|
+
// Environment class object, not a constant — default to MOUNTED so
|
|
56
|
+
// validateCameraRequirements' happy path is the default and tests
|
|
57
|
+
// only override it for the failure case.
|
|
58
|
+
environmentMock.`when`<String> { Environment.getExternalStorageState() }
|
|
59
|
+
.thenReturn(Environment.MEDIA_MOUNTED)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
@After
|
|
63
|
+
fun tearDown() {
|
|
64
|
+
contextCompatMock.close()
|
|
65
|
+
environmentMock.close()
|
|
66
|
+
picturesDir.deleteRecursively()
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private fun stubPermission(granted: Boolean) {
|
|
70
|
+
contextCompatMock.`when`<Int> { ContextCompat.checkSelfPermission(any(), any()) }
|
|
71
|
+
.thenReturn(if (granted) PackageManager.PERMISSION_GRANTED else PackageManager.PERMISSION_DENIED)
|
|
72
|
+
}
|
|
73
|
+
|
|
25
74
|
// ============================================================
|
|
26
|
-
//
|
|
75
|
+
// hasCameraPermission / getPermissionStatus
|
|
27
76
|
// ============================================================
|
|
28
77
|
|
|
29
|
-
/**
|
|
30
|
-
* Test image file naming convention
|
|
31
|
-
* Validates JPEG_timestamp_.jpg format
|
|
32
|
-
*/
|
|
33
78
|
@Test
|
|
34
|
-
fun
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
val timestamp1 = dateFormat.format(Date())
|
|
38
|
-
|
|
39
|
-
// Validate format
|
|
40
|
-
assertTrue(timestamp1.matches(Regex("\\d{8}_\\d{6}")))
|
|
41
|
-
|
|
42
|
-
// Test filename construction
|
|
43
|
-
val filename1 = "JPEG_${timestamp1}_.jpg"
|
|
44
|
-
assertTrue(filename1.startsWith("JPEG_"))
|
|
45
|
-
assertTrue(filename1.endsWith(".jpg"))
|
|
46
|
-
assertTrue(filename1.contains(timestamp1))
|
|
47
|
-
|
|
48
|
-
// Ensure uniqueness by timestamp
|
|
49
|
-
Thread.sleep(1000) // Wait 1 second for different timestamp
|
|
50
|
-
val timestamp2 = dateFormat.format(Date())
|
|
51
|
-
val filename2 = "JPEG_${timestamp2}_.jpg"
|
|
52
|
-
|
|
53
|
-
assertNotEquals(filename1, filename2)
|
|
79
|
+
fun `hasCameraPermission returns true when ContextCompat reports granted`() {
|
|
80
|
+
stubPermission(granted = true)
|
|
81
|
+
assertTrue(CameraUtils.hasCameraPermission(activity))
|
|
54
82
|
}
|
|
55
83
|
|
|
56
|
-
/**
|
|
57
|
-
* Test photo file extension validation
|
|
58
|
-
* Validates .jpg extension requirement
|
|
59
|
-
*/
|
|
60
84
|
@Test
|
|
61
|
-
fun
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
// Test valid extensions
|
|
66
|
-
validExtensions.forEach { ext ->
|
|
67
|
-
val filename = "JPEG_20231203_123456_$ext"
|
|
68
|
-
assertTrue(filename.endsWith(".jpg") || filename.endsWith(".jpeg"))
|
|
69
|
-
}
|
|
85
|
+
fun `hasCameraPermission returns false when ContextCompat reports denied`() {
|
|
86
|
+
stubPermission(granted = false)
|
|
87
|
+
assertFalse(CameraUtils.hasCameraPermission(activity))
|
|
88
|
+
}
|
|
70
89
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
90
|
+
@Test
|
|
91
|
+
fun `getPermissionStatus returns GRANTED when permission is granted`() {
|
|
92
|
+
stubPermission(granted = true)
|
|
93
|
+
assertEquals("GRANTED", CameraUtils.getPermissionStatus(activity))
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@Test
|
|
97
|
+
fun `getPermissionStatus returns DENIED when permission is denied`() {
|
|
98
|
+
stubPermission(granted = false)
|
|
99
|
+
assertEquals("DENIED", CameraUtils.getPermissionStatus(activity))
|
|
75
100
|
}
|
|
76
101
|
|
|
77
102
|
// ============================================================
|
|
78
|
-
//
|
|
103
|
+
// createImageFile
|
|
79
104
|
// ============================================================
|
|
80
105
|
|
|
81
|
-
/**
|
|
82
|
-
* Test base64 size limit validation
|
|
83
|
-
* Validates 10 MB threshold for base64 conversion
|
|
84
|
-
*/
|
|
85
106
|
@Test
|
|
86
|
-
fun
|
|
87
|
-
val
|
|
88
|
-
|
|
89
|
-
// Small image - should be eligible for base64
|
|
90
|
-
val smallImage = 500 * 1024L // 500 KB
|
|
91
|
-
assertTrue(smallImage <= base64Limit)
|
|
92
|
-
|
|
93
|
-
// Medium image - should be eligible
|
|
94
|
-
val mediumImage = 5 * 1024 * 1024L // 5 MB
|
|
95
|
-
assertTrue(mediumImage <= base64Limit)
|
|
96
|
-
|
|
97
|
-
// Exactly at limit - should be eligible
|
|
98
|
-
val atLimit = base64Limit
|
|
99
|
-
assertTrue(atLimit <= base64Limit)
|
|
107
|
+
fun `createImageFile creates a real JPEG_ prefixed jpg file in the pictures dir`() {
|
|
108
|
+
val file = CameraUtils.createImageFile(activity)
|
|
100
109
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
110
|
+
assertTrue(file.exists())
|
|
111
|
+
assertTrue(file.name.startsWith("JPEG_"))
|
|
112
|
+
assertTrue(file.name.endsWith(".jpg"))
|
|
113
|
+
assertEquals(picturesDir.canonicalPath, file.parentFile?.canonicalPath)
|
|
104
114
|
|
|
105
|
-
|
|
106
|
-
val veryLargeImage = 50 * 1024 * 1024L // 50 MB
|
|
107
|
-
assertFalse(veryLargeImage <= base64Limit)
|
|
115
|
+
file.delete()
|
|
108
116
|
}
|
|
109
117
|
|
|
110
|
-
/**
|
|
111
|
-
* Test image file size estimation
|
|
112
|
-
* Validates size calculation for different resolutions
|
|
113
|
-
*/
|
|
114
118
|
@Test
|
|
115
|
-
fun
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
// 5 MP = ~1.5-2.5 MB
|
|
119
|
-
// 12 MP = ~3-4 MB
|
|
120
|
-
// 20 MP = ~5-7 MB
|
|
121
|
-
|
|
122
|
-
val oneMegapixel = 400 * 1024L // ~400 KB
|
|
123
|
-
val fiveMegapixel = 2 * 1024 * 1024L // ~2 MB
|
|
124
|
-
val twelveMegapixel = 3.5 * 1024 * 1024 // ~3.5 MB
|
|
125
|
-
val twentyMegapixel = 6 * 1024 * 1024L // ~6 MB
|
|
126
|
-
|
|
127
|
-
// Validate relative sizes
|
|
128
|
-
assertTrue(oneMegapixel < fiveMegapixel)
|
|
129
|
-
assertTrue(fiveMegapixel < twelveMegapixel)
|
|
130
|
-
assertTrue(twelveMegapixel < twentyMegapixel)
|
|
131
|
-
|
|
132
|
-
// Validate base64 eligibility
|
|
133
|
-
val base64Limit = 10 * 1024 * 1024L
|
|
134
|
-
assertTrue(oneMegapixel <= base64Limit)
|
|
135
|
-
assertTrue(fiveMegapixel <= base64Limit)
|
|
136
|
-
assertTrue(twelveMegapixel <= base64Limit)
|
|
137
|
-
assertTrue(twentyMegapixel <= base64Limit)
|
|
138
|
-
}
|
|
119
|
+
fun `createImageFile produces distinct files on successive calls`() {
|
|
120
|
+
val file1 = CameraUtils.createImageFile(activity)
|
|
121
|
+
val file2 = CameraUtils.createImageFile(activity)
|
|
139
122
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
@Test
|
|
145
|
-
fun testImageQuality_parameterValidation() {
|
|
146
|
-
// Quality values typically range 0-100
|
|
147
|
-
val lowQuality = 30
|
|
148
|
-
val mediumQuality = 60
|
|
149
|
-
val highQuality = 90
|
|
150
|
-
val maxQuality = 100
|
|
151
|
-
|
|
152
|
-
// Validate range
|
|
153
|
-
assertTrue(lowQuality in 0..100)
|
|
154
|
-
assertTrue(mediumQuality in 0..100)
|
|
155
|
-
assertTrue(highQuality in 0..100)
|
|
156
|
-
assertTrue(maxQuality in 0..100)
|
|
157
|
-
|
|
158
|
-
// Validate ordering
|
|
159
|
-
assertTrue(lowQuality < mediumQuality)
|
|
160
|
-
assertTrue(mediumQuality < highQuality)
|
|
161
|
-
assertTrue(highQuality <= maxQuality)
|
|
162
|
-
|
|
163
|
-
// Test invalid values
|
|
164
|
-
val tooLow = -10
|
|
165
|
-
val tooHigh = 150
|
|
166
|
-
assertFalse(tooLow in 0..100)
|
|
167
|
-
assertFalse(tooHigh in 0..100)
|
|
123
|
+
assertNotEquals(file1.name, file2.name)
|
|
124
|
+
|
|
125
|
+
file1.delete()
|
|
126
|
+
file2.delete()
|
|
168
127
|
}
|
|
169
128
|
|
|
170
129
|
// ============================================================
|
|
171
|
-
//
|
|
130
|
+
// validateCameraRequirements
|
|
172
131
|
// ============================================================
|
|
173
132
|
|
|
174
|
-
/**
|
|
175
|
-
* Test camera permission status strings
|
|
176
|
-
* Validates GRANTED, DENIED, NOT_DETERMINED states
|
|
177
|
-
*/
|
|
178
133
|
@Test
|
|
179
|
-
fun
|
|
180
|
-
val
|
|
134
|
+
fun `validateCameraRequirements passes when device has a camera and storage is mounted`() {
|
|
135
|
+
val packageManager = mock<PackageManager> {
|
|
136
|
+
on { hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) } doReturn true
|
|
137
|
+
}
|
|
138
|
+
whenever(activity.packageManager) doReturn packageManager
|
|
181
139
|
|
|
182
|
-
//
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
assertTrue(validStates.contains("NOT_DETERMINED"))
|
|
140
|
+
// Does not throw.
|
|
141
|
+
CameraUtils.validateCameraRequirements(activity)
|
|
142
|
+
}
|
|
186
143
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
144
|
+
@Test
|
|
145
|
+
fun `validateCameraRequirements throws when device has no camera`() {
|
|
146
|
+
val packageManager = mock<PackageManager> {
|
|
147
|
+
on { hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) } doReturn false
|
|
148
|
+
}
|
|
149
|
+
whenever(activity.packageManager) doReturn packageManager
|
|
191
150
|
|
|
192
|
-
|
|
193
|
-
|
|
151
|
+
val error = assertThrows(IllegalStateException::class.java) {
|
|
152
|
+
CameraUtils.validateCameraRequirements(activity)
|
|
153
|
+
}
|
|
154
|
+
assertEquals("Device does not have a camera", error.message)
|
|
194
155
|
}
|
|
195
156
|
|
|
196
|
-
/**
|
|
197
|
-
* Test permission status logic flow
|
|
198
|
-
* Validates permission check decision tree
|
|
199
|
-
*/
|
|
200
157
|
@Test
|
|
201
|
-
fun
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
fun getStatusString(state: PermissionState): String {
|
|
206
|
-
return if (state.hasPermission) {
|
|
207
|
-
"GRANTED"
|
|
208
|
-
} else {
|
|
209
|
-
when {
|
|
210
|
-
state.wasDenied -> "DENIED"
|
|
211
|
-
else -> "NOT_DETERMINED"
|
|
212
|
-
}
|
|
213
|
-
}
|
|
158
|
+
fun `validateCameraRequirements throws when external storage is not mounted`() {
|
|
159
|
+
val packageManager = mock<PackageManager> {
|
|
160
|
+
on { hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY) } doReturn true
|
|
214
161
|
}
|
|
162
|
+
whenever(activity.packageManager) doReturn packageManager
|
|
163
|
+
environmentMock.`when`<String> { Environment.getExternalStorageState() }
|
|
164
|
+
.thenReturn(Environment.MEDIA_UNMOUNTED)
|
|
215
165
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
assertEquals("
|
|
220
|
-
|
|
221
|
-
// Edge case: has permission but was previously denied (shouldn't happen)
|
|
222
|
-
assertEquals("GRANTED", getStatusString(PermissionState(true, true)))
|
|
166
|
+
val error = assertThrows(IllegalStateException::class.java) {
|
|
167
|
+
CameraUtils.validateCameraRequirements(activity)
|
|
168
|
+
}
|
|
169
|
+
assertEquals("External storage not available", error.message)
|
|
223
170
|
}
|
|
224
171
|
|
|
225
172
|
// ============================================================
|
|
226
|
-
//
|
|
173
|
+
// cleanupOldCameraFiles
|
|
227
174
|
// ============================================================
|
|
228
175
|
|
|
229
|
-
/**
|
|
230
|
-
* Test camera file age threshold validation
|
|
231
|
-
* Validates 7-day default cleanup threshold
|
|
232
|
-
*/
|
|
233
176
|
@Test
|
|
234
|
-
fun
|
|
235
|
-
val
|
|
236
|
-
val
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
val thresholdFileModified = currentTime - maxAgeMillis
|
|
245
|
-
val thresholdAge = currentTime - thresholdFileModified
|
|
246
|
-
assertFalse(thresholdAge > maxAgeMillis)
|
|
247
|
-
|
|
248
|
-
// Old file - should be deleted
|
|
249
|
-
val oldFileModified = currentTime - (10 * 24 * 60 * 60 * 1000L) // 10 days old
|
|
250
|
-
val oldAge = currentTime - oldFileModified
|
|
251
|
-
assertTrue(oldAge > maxAgeMillis)
|
|
252
|
-
|
|
253
|
-
// Very old file - should be deleted
|
|
254
|
-
val veryOldFileModified = currentTime - (30 * 24 * 60 * 60 * 1000L) // 30 days old
|
|
255
|
-
val veryOldAge = currentTime - veryOldFileModified
|
|
256
|
-
assertTrue(veryOldAge > maxAgeMillis)
|
|
177
|
+
fun `cleanupOldCameraFiles deletes files older than maxAgeMillis`() {
|
|
178
|
+
val maxAge = 7 * 24 * 60 * 60 * 1000L
|
|
179
|
+
val oldFile = File(picturesDir, "JPEG_20200101_000000_.jpg").apply {
|
|
180
|
+
createNewFile()
|
|
181
|
+
setLastModified(System.currentTimeMillis() - (10 * 24 * 60 * 60 * 1000L))
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
CameraUtils.cleanupOldCameraFiles(activity, maxAge)
|
|
185
|
+
|
|
186
|
+
assertFalse(oldFile.exists())
|
|
257
187
|
}
|
|
258
188
|
|
|
259
|
-
/**
|
|
260
|
-
* Test camera file pattern matching
|
|
261
|
-
* Validates JPEG_timestamp_.jpg pattern recognition
|
|
262
|
-
*/
|
|
263
189
|
@Test
|
|
264
|
-
fun
|
|
265
|
-
|
|
266
|
-
val
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
"JPEG_20231231_235959_.jpg"
|
|
270
|
-
)
|
|
271
|
-
|
|
272
|
-
// Invalid patterns
|
|
273
|
-
val invalidFiles = listOf(
|
|
274
|
-
"photo.jpg",
|
|
275
|
-
"image_20231203.jpg",
|
|
276
|
-
"JPEG_123456.jpg",
|
|
277
|
-
"jpeg_20231203_123456_.jpg", // lowercase
|
|
278
|
-
"JPEG_20231203_123456_.png", // wrong extension
|
|
279
|
-
"JPEG_20231203_123456.jpg" // missing underscore before extension
|
|
280
|
-
)
|
|
281
|
-
|
|
282
|
-
// Test valid files match pattern
|
|
283
|
-
val cameraFilePattern = Regex("^JPEG_\\d{8}_\\d{6}_.*\\.jpg$")
|
|
284
|
-
validFiles.forEach { filename ->
|
|
285
|
-
assertTrue("$filename should match camera file pattern",
|
|
286
|
-
filename.startsWith("JPEG_") && filename.endsWith(".jpg"))
|
|
190
|
+
fun `cleanupOldCameraFiles keeps files younger than maxAgeMillis`() {
|
|
191
|
+
val maxAge = 7 * 24 * 60 * 60 * 1000L
|
|
192
|
+
val recentFile = File(picturesDir, "JPEG_20991231_235959_.jpg").apply {
|
|
193
|
+
createNewFile()
|
|
194
|
+
setLastModified(System.currentTimeMillis() - (1 * 24 * 60 * 60 * 1000L))
|
|
287
195
|
}
|
|
288
196
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
197
|
+
CameraUtils.cleanupOldCameraFiles(activity, maxAge)
|
|
198
|
+
|
|
199
|
+
assertTrue(recentFile.exists())
|
|
200
|
+
recentFile.delete()
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
@Test
|
|
204
|
+
fun `cleanupOldCameraFiles ignores files not matching the JPEG_ prefix pattern`() {
|
|
205
|
+
val maxAge = 7 * 24 * 60 * 60 * 1000L
|
|
206
|
+
val unrelatedOldFile = File(picturesDir, "notes.txt").apply {
|
|
207
|
+
createNewFile()
|
|
208
|
+
setLastModified(System.currentTimeMillis() - (30 * 24 * 60 * 60 * 1000L))
|
|
294
209
|
}
|
|
210
|
+
|
|
211
|
+
CameraUtils.cleanupOldCameraFiles(activity, maxAge)
|
|
212
|
+
|
|
213
|
+
assertTrue(unrelatedOldFile.exists())
|
|
214
|
+
unrelatedOldFile.delete()
|
|
295
215
|
}
|
|
296
216
|
}
|