Flutter Test Report – astromatrix-flutter

Generated: 2/1/2026, 12:01:14 AM

Summary

Passed: 104

Failed: 3

Skipped: 0

Test Results

Test #1 (unknown) SUCCESS
Test #2 (unknown) SUCCESS
Logs: ✅ Storage initialized
Test #3 (unknown) SUCCESS
Logs: 🔥 Testing Traits API with multiple components... 📍 Testing: Transit Aspect Component: Saturn Sextile Uranus Category: Planet Aspects 📞 Calling getComponentTraits()... 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Saturn%20Sextile%20Uranus&Category=Planet%20Aspects&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Saturn%20Sextile%20Uranus&Category=Planet%20Aspects&Language=en 📡 Response received: Success: false ❌ Error: Server error (404) 📍 Testing: Natal Planet Component: Sun in Leo Category: Planets 📞 Calling getComponentTraits()... 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Sun%20in%20Leo&Category=Planets&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Sun%20in%20Leo&Category=Planets&Language=en 📡 Response received: Success: false ❌ Error: Server error (404) 📍 Testing: House Placement Component: Sun in 1st House Category: Houses 📞 Calling getComponentTraits()... 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Sun%20in%201st%20House&Category=Houses&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Sun%20in%201st%20House&Category=Houses&Language=en 📡 Response received: Success: false ❌ Error: Server error (404) 📍 Testing: Another Aspect Component: Moon Square Venus Category: Planet Aspects 📞 Calling getComponentTraits()... 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Moon%20Square%20Venus&Category=Planet%20Aspects&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Moon%20Square%20Venus&Category=Planet%20Aspects&Language=en 📡 Response received: Success: false ❌ Error: Server error (404) 🏁 All component tests completed!
Test #4 (unknown) SUCCESS
Logs: 🔬 Validating Traits API response format... 📞 Calling API with: "Saturn Sextile Uranus" / "Planet Aspects" 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Saturn%20Sextile%20Uranus&Category=Planet%20Aspects&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Saturn%20Sextile%20Uranus&Category=Planet%20Aspects&Language=en 📡 API Response Analysis: Success: false Error: Server error (404) Traits object: NULL ❌ Traits object is NULL This means the API call failed or returned null Error message: Server error (404)
Test #5 (unknown) SUCCESS
Logs: 🔍 Checking API URL construction... Expected API endpoint: https://astromatrix.org/api/utility/GetComponentTraits Expected parameters: component: [URL encoded component name] Category: [URL encoded category] Language: en (or user preference) Example URL for "Saturn Sextile Uranus": https://astromatrix.org/api/utility/GetComponentTraits?component=Saturn%20Sextile%20Uranus&Category=Planet%20Aspects&Language=en 📞 Making real API call... 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Saturn%20Sextile%20Uranus&Category=Planet%20Aspects&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Saturn%20Sextile%20Uranus&Category=Planet%20Aspects&Language=en 📡 Call completed: Success: false ❌ API call failed Error: Server error (404)
Test #6 (unknown) SUCCESS
Test #7 (unknown) SUCCESS
Test #8 (unknown) SUCCESS
Logs: 📊 Comprehensive Traits API Summary ====================================================================== 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Saturn%20Sextile%20Uranus&Category=Planet%20Aspects&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Saturn%20Sextile%20Uranus&Category=Planet%20Aspects&Language=en ❌ Saturn Sextile Uranus / Planet Aspects Failed: Server error (404) 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Sun%20in%20Leo&Category=Planets&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Sun%20in%20Leo&Category=Planets&Language=en ❌ Sun in Leo / Planets Failed: Server error (404) 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Moon%20in%201st%20House&Category=Houses&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Moon%20in%201st%20House&Category=Houses&Language=en ❌ Moon in 1st House / Houses Failed: Server error (404) 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Venus%20Trine%20Mars&Category=Planet%20Aspects&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Venus%20Trine%20Mars&Category=Planet%20Aspects&Language=en ❌ Venus Trine Mars / Planet Aspects Failed: Server error (404) 🌐 Fetching traits: https://club.astromatrix.org/component/GetComponentTraits?component=Jupiter%20in%20Sagittarius&Category=Planets&Language=en 🌐 GET: https://club.astromatrix.org/component/GetComponentTraits?component=Jupiter%20in%20Sagittarius&Category=Planets&Language=en ❌ Jupiter in Sagittarius / Planets Failed: Server error (404) ====================================================================== 📈 Final Statistics: Total tested: 5 Successful calls: 0 With actual traits: 0 Empty responses: 0 Failed calls: 5 ⚠️ WARNING: No components returned traits! Possible issues: - Database has no trait data - Wrong API endpoint - Parsing error in ComponentTraits.fromJson() - Wrong component/category combinations
Test #9 (unknown) SUCCESS
Test #10 (unknown) SUCCESS
Test #11 (unknown) ERROR
type '_$ChartDateImpl' is not a subtype of type 'Map' in type cast test/simple_payload_test.dart 138:41 main.
Logs: ================================================================================ PAYLOAD COMPARISON TEST ================================================================================ 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Toulouse Found 1 location suggestions for 'Toulouse' (Advanced: false) Selecting location: Toulouse, , France 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Toulouse%2C%20%2C%20France 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=495148800&lat=43.60426&lng=1.44367 Location selected successfully: Toulouse, , France 🟢 PAYLOAD FROM FORM (CORRECT) ================================================================================ { "type": "birthchart", "typename": "Birth", "path": "/edituser", "date1": { "name": "Test", "day": "9", "month": "9", "year": 1985, "fullDate": "9/9/1985", "fullDateStr": "September 9th 1985 21:20", "timeHour": 9, "timeMinute": "20", "timePM": "PM", "time": "21:20", "town": "Toulouse, , France", "selectedTown": true, "lat": 43.60426, "lng": 1.44367, "timeOffset": "120", "dst": true, "noTime": false, "mainUser": false, "type": "Birth" }, "date2": null, "transitDate": { "day": "1", "month": "2", "year": "2026", "fullDate": "1/2/2026", "fullDateStr": "February 1st 2026 0:00", "time": "0:00", "timeOffset": "0" }, "houseSystemStr": "Placidus", "houseSystem": "P", "mobile": true, "version": "2.5", "constraints": "8", "smartOrb": false, "descriptions": true, "famous": false, "sidereal": false, "serviceType": "Display", "getPatterns": false, "uid": null, "fid": null, "progressedDate": null } 🟢 RESPONSE FROM FORM PAYLOAD ================================================================================ 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test, day: 9, month: 9, year: 1985, fullDate: 9/9/1985, fullDateStr: September 9th 1985 21:20, timeHour: 9, timeMinute: 20, timePM: PM, time: 21:20, town: Toulouse, , France, selectedTown: true, lat: 43.60426, lng: 1.44367, timeOffset: 120, dst: true, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} Sun: Virgo 167.0420725240564° Moon: Cancer 103.14858954261324° Asc: Aries 18.713780957401667° 🔵 PAYLOAD FROM USER (POTENTIALLY WRONG) ================================================================================ { "type": "birthchart", "typename": "Birth", "path": "/chartview", "date1": { "name": "Test", "day": "9", "month": "9", "year": 1985, "fullDate": "9/9/1985", "fullDateStr": "September 9th 1985 21:20", "timeHour": 9, "timeMinute": "20", "timePM": "PM", "time": "21:20", "town": "Toulouse, , France", "lat": 43.60426, "lng": 1.44367, "timeOffset": "120", "noTime": false, "mainUser": true, "type": "Birth" }, "date2": { "fullDate": "undefined/undefined/undefined", "fullDateStr": "undefined undefinedth undefined undefined" }, "transitDate": { "day": "1", "month": "2", "year": "2026", "fullDate": "1/2/2026", "fullDateStr": "February 1st 2026 0:00", "time": "0:00", "timeOffset": "0" }, "houseSystemStr": "Placidus", "houseSystem": "P", "mobile": true, "version": "2.5", "constraints": "8", "smartOrb": false, "descriptions": true, "famous": false, "sidereal": false, "serviceType": "Display", "getPatterns": false, "uid": "test", "fid": "test", "progressedDate": null } 🔵 RESPONSE FROM USER PAYLOAD ================================================================================ 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /chartview, date1: ChartDate(name: Test, day: 9, month: 9, year: 1985, fullDate: 9/9/1985, fullDateStr: September 9th 1985 21:20, timeHour: 9, timeMinute: 20, timePM: PM, time: 21:20, town: Toulouse, , France, selectedTown: null, lat: 43.60426, lng: 1.44367, timeOffset: 120, dst: null, noTime: false, bio: null, mainUser: true, type: Birth), date2: ChartDate(name: null, day: null, month: null, year: null, fullDate: undefined/undefined/undefined, fullDateStr: undefined undefinedth undefined undefined, timeHour: null, timeMinute: null, timePM: null, time: null, town: null, selectedTown: null, lat: null, lng: null, timeOffset: null, dst: null, noTime: null, bio: null, mainUser: null, type: null), transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: test, fid: test, progressedDate: null} Sun: Virgo 167.0420725240564° Moon: Cancer 103.14858954261324° Asc: Aries 18.713780957401667° ================================================================================ DIFFERENCES ================================================================================
Test #12 (unknown) SUCCESS
Logs: 🚀 Starting API Integration Tests...
Test #13 (unknown) SUCCESS
Test #14 (unknown) ERROR
Exception: Server error (400) package:astromatrix/core/astro_api_service.dart 84:26 AstroApiService._fetchCityLocationsFromAstroMatrix
Logs: 🔍 Testing location search for "New York"... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=New%20York Warning: At least one test in this suite creates an HttpClient. When running a test suite that uses TestWidgetsFlutterBinding, all HTTP requests will return status code 400, and no network request will actually be made. Any test expecting a real network connection and status code will fail. To test code that needs an HttpClient, provide your own HttpClient implementation to the code under test, so that your test can consistently provide a testable response to the code under test.
Test #15 (unknown) ERROR
Exception: Server error (400) package:astromatrix/core/astro_api_service.dart 84:26 AstroApiService._fetchCityLocationsFromAstroMatrix
Logs: 🔍 Testing location search for "London"... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=London
Test #16 (unknown) ERROR
Exception: Server error (400) package:astromatrix/core/astro_api_service.dart 84:26 AstroApiService._fetchCityLocationsFromAstroMatrix
Logs: 🌍 Testing timezone lookup... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Paris
Test #17 (unknown) SUCCESS
Logs: 🔍 Testing empty query... ✅ Empty query handled correctly
Test #18 (unknown) SUCCESS
Logs: 🔍 Testing short query... ✅ Short query handled correctly
Test #19 (unknown) ERROR
Exception: Server error (400) package:astromatrix/core/astro_api_service.dart 84:26 AstroApiService._fetchCityLocationsFromAstroMatrix
Logs: 🌟 Testing birth chart calculation... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Tokyo
Test #20 (unknown) ERROR
Exception: Server error (400) package:astromatrix/core/astro_api_service.dart 84:26 AstroApiService._fetchCityLocationsFromAstroMatrix
Logs: 🌟 Testing multiple locations... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Berlin
Test #21 (unknown) ERROR
Exception: Server error (400) package:astromatrix/core/astro_api_service.dart 84:26 AstroApiService._fetchCityLocationsFromAstroMatrix
Logs: 🚀 Testing complete user flow... Step 1: Searching locations... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Rome
Test #22 (unknown) ERROR
Exception: Server error (400) package:astromatrix/core/astro_api_service.dart 84:26 AstroApiService._fetchCityLocationsFromAstroMatrix
Logs: 🧪 Testing invalid city... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=ZZZInvalidCity999
Test #23 (unknown) SUCCESS
Logs: 🧪 Testing form validation... ✅ Empty name validation works
Test #24 (unknown) SUCCESS
Logs: 🧪 Testing invalid date... ✅ Date validation works
Test #25 (unknown) SUCCESS
Logs: 🧪 Testing invalid time... ✅ Time validation works
Test #26 (unknown) SUCCESS
Logs: ✅ All tests completed!
Test #27 (unknown) SUCCESS
Test #28 (unknown) SUCCESS
Logs: ✅ Storage initialized
Test #29 (unknown) SUCCESS
Test #30 (unknown) SUCCESS
Logs: 🔬 COMPREHENSIVE TEST: Form → UserService → Calculation ======================================================================
Test #31 (unknown) SUCCESS
Test #32 (unknown) SUCCESS
Test #33 (unknown) SUCCESS
Logs: 🔥 Testing Login... 1. Valid credentials: 🌐 POST: https://club.astromatrix.org/users/Login 📦 Payload: {uid: mark@test.user, tempID: mark@test.user, password: 111} 🚫 sendToWeb skipped (originated from WebView or hybrid off) Success: true Message: Login successful Data: null 2. Wrong password: 🌐 POST: https://club.astromatrix.org/users/Login 📦 Payload: {uid: mark@test.user, tempID: mark@test.user, password: 112} Success: false Message: Password is incorrect. Choose forgot password if needed. 3. Not found: 🌐 POST: https://club.astromatrix.org/users/Login 📦 Payload: {uid: fake@user.com, tempID: fake@user.com, password: 111} Success: false Message: Account not found. Check email spelling... ============================================================ 🔥 Testing Reset Password... 4. Reset password - valid email: 🌐 POST: https://club.astromatrix.org/users/ForgotPassword 📦 Payload: {uid: mark@test.user} Result: OK Expected: OK 5. Reset password - email not found: 🌐 POST: https://club.astromatrix.org/users/ForgotPassword 📦 Payload: {uid: fake@user.com} Result: NotFound Expected: NotFound or Error 6. Reset password - empty email: 🌐 POST: https://club.astromatrix.org/users/ForgotPassword 📦 Payload: {uid: } Result: Error Expected: NotFound or Error ============================================================ 🔥 Testing Create Account... 7. Create account - existing email: 🌐 POST: https://club.astromatrix.org/users/CreateAccount 📦 Payload: {uid: mark@test.user, password: 111, tempID: mark@test.user} Result: AccountExists Expected: AccountExists 8. Create account - new email: 🌐 POST: https://club.astromatrix.org/users/CreateAccount 📦 Payload: {uid: newuser1769904056353@test.com, password: 111, tempID: newuser1769904056353@test.com} Result: OK Expected: OK 9. Create account - empty password: 🌐 POST: https://club.astromatrix.org/users/CreateAccount 📦 Payload: {uid: test@user.com, password: , tempID: test@user.com} Result: AccountExists Expected: Error or validation message ============================================================ 🔥 Testing Change Password... 10. Change password - wrong current password: 🌐 POST: https://club.astromatrix.org/users/ChangePassword 📦 Payload: {uid: mark@test.user, password1: wrongpass, password2: 111} Result: Your current password is not correct Expected: Your current password is not correct 11. Change password - correct current password: 🌐 POST: https://club.astromatrix.org/users/ChangePassword 📦 Payload: {uid: mark@test.user, password1: 111, password2: 111} Result: Your current password is not correct Expected: OK ============================================================ ✅ All tests completed!
Test #34 (unknown) SUCCESS
Test #35 (unknown) SUCCESS
Logs: ============================================================ 🔍 INSPECTING API RESPONSE STRUCTURE ============================================================ ⚠️ Cannot save preference chart_service_user1_id: No user logged in 🌐 [self] Starting API call 🌐 POST: https://astromatrix.org/API/Astrology/CalculateHoroscopes 📦 Payload: {type: self, typename: self, path: /facets, date1: ChartDate(name: Test User, day: 4, month: 1, year: 2000, fullDate: 4/1/2000, fullDateStr: January 4th 2000 22:00, timeHour: 10, timeMinute: 00, timePM: PM, time: 22:00, town: Sydney, New South Wales, Australia, selectedTown: null, lat: -33.86785, lng: 151.20732, timeOffset: 660, dst: null, noTime: false, bio: null, mainUser: true, type: Birth), date2: ChartDate(name: Test User, day: 4, month: 1, year: 2000, fullDate: 4/1/2000, fullDateStr: January 4th 2000 22:00, timeHour: null, timeMinute: null, timePM: null, time: 22:00, town: Sydney, New South Wales, Australia, selectedTown: null, lat: -33.86785, lng: 151.20732, timeOffset: 660, dst: null, noTime: false, bio: null, mainUser: null, type: null), transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: test, fid: test, progressedDate: null} ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in ✅ API call successful ============================================================ 📝 GENERATED DART MODEL CLASSES ============================================================ class HoroscopeResponse { class Chart { class Cache { class Meta { final String? planet; final String? house; final dynamic aspect; final String? sign; final dynamic planet2; final String? modality; final String? element; final String? ruler; final String? houseRuler; final String? houseTheme; final String? elementPhrase; final String? expression; final dynamic action; final dynamic expression2; final String? shortTheme; final String? focus; final String? planetTheme; final String? beginsStr; final String? endsStr; final dynamic exactStr; final String? beginsTime; Meta({ this.planet, this.house, this.aspect, this.sign, this.planet2, this.modality, this.element, this.ruler, this.houseRuler, this.houseTheme, this.elementPhrase, this.expression, this.action, this.expression2, this.shortTheme, this.focus, this.planetTheme, this.beginsStr, this.endsStr, this.exactStr, this.beginsTime, }); factory Meta.fromJson(Map json) { return Meta( planet: json['planet'] as String?, house: json['house'] as String?, aspect: json['aspect'], sign: json['sign'] as String?, planet2: json['planet2'], modality: json['modality'] as String?, element: json['element'] as String?, ruler: json['ruler'] as String?, houseRuler: json['houseRuler'] as String?, houseTheme: json['houseTheme'] as String?, elementPhrase: json['elementPhrase'] as String?, expression: json['expression'] as String?, action: json['action'], expression2: json['expression2'], shortTheme: json['shortTheme'] as String?, focus: json['focus'] as String?, planetTheme: json['planetTheme'] as String?, beginsStr: json['beginsStr'] as String?, endsStr: json['endsStr'] as String?, exactStr: json['exactStr'], beginsTime: json['beginsTime'] as String?, ); } Map toJson() { return { 'planet': planet, 'house': house, 'aspect': aspect, 'sign': sign, 'planet2': planet2, 'modality': modality, 'element': element, 'ruler': ruler, 'houseRuler': houseRuler, 'houseTheme': houseTheme, 'elementPhrase': elementPhrase, 'expression': expression, 'action': action, 'expression2': expression2, 'shortTheme': shortTheme, 'focus': focus, 'planetTheme': planetTheme, 'beginsStr': beginsStr, 'endsStr': endsStr, 'exactStr': exactStr, 'beginsTime': beginsTime, }; } } final int? cacheID; final String? userID; final String? category; final String? component; final String? phrase; final String? begins; final String? ends; final dynamic exact; final String? type; final double? degree; final String? hash; final String? image; final String? created; final String? sign; final bool? retrograde; final double? declination; final int? percentComplete; final String? concept; final String? facet; final dynamic facet2; final String? opportunity; final String? pattern; final dynamic description; final Meta? meta; Cache({ this.cacheID, this.userID, this.category, this.component, this.phrase, this.begins, this.ends, this.exact, this.type, this.degree, this.hash, this.image, this.created, this.sign, this.retrograde, this.declination, this.percentComplete, this.concept, this.facet, this.facet2, this.opportunity, this.pattern, this.description, this.meta, }); factory Cache.fromJson(Map json) { return Cache( cacheID: json['CacheID'] as int?, userID: json['UserID'] as String?, category: json['Category'] as String?, component: json['Component'] as String?, phrase: json['Phrase'] as String?, begins: json['Begins'] as String?, ends: json['Ends'] as String?, exact: json['Exact'], type: json['Type'] as String?, degree: (json['Degree'] as num?)?.toDouble(), hash: json['Hash'] as String?, image: json['Image'] as String?, created: json['Created'] as String?, sign: json['Sign'] as String?, retrograde: json['Retrograde'] as bool?, declination: (json['Declination'] as num?)?.toDouble(), percentComplete: json['PercentComplete'] as int?, concept: json['Concept'] as String?, facet: json['Facet'] as String?, facet2: json['Facet2'], opportunity: json['Opportunity'] as String?, pattern: json['Pattern'] as String?, description: json['Description'], meta: json['meta'] != null ? Meta.fromJson(json['meta'] as Map) : null, ); } Map toJson() { return { 'CacheID': cacheID, 'UserID': userID, 'Category': category, 'Component': component, 'Phrase': phrase, 'Begins': begins, 'Ends': ends, 'Exact': exact, 'Type': type, 'Degree': degree, 'Hash': hash, 'Image': image, 'Created': created, 'Sign': sign, 'Retrograde': retrograde, 'Declination': declination, 'PercentComplete': percentComplete, 'Concept': concept, 'Facet': facet, 'Facet2': facet2, 'Opportunity': opportunity, 'Pattern': pattern, 'Description': description, 'meta': meta?.toJson(), }; } } class Planetreturn { final String? planet; final String? name; final String? url; final String? returnDate; Planetreturn({ this.planet, this.name, this.url, this.returnDate, }); factory Planetreturn.fromJson(Map json) { return Planetreturn( planet: json['planet'] as String?, name: json['name'] as String?, url: json['url'] as String?, returnDate: json['returnDate'] as String?, ); } Map toJson() { return { 'planet': planet, 'name': name, 'url': url, 'returnDate': returnDate, }; } } class Info { class Date1 { final String? name; final int? day; final int? month; final int? year; final String? time; final String? town; final dynamic country; final double? timeOffset; final bool? noTime; final String? fullDate; final bool? selectedTown; final dynamic fid; final dynamic uid; final double? lat; final double? lng; final bool? mainUser; Date1({ this.name, this.day, this.month, this.year, this.time, this.town, this.country, this.timeOffset, this.noTime, this.fullDate, this.selectedTown, this.fid, this.uid, this.lat, this.lng, this.mainUser, }); factory Date1.fromJson(Map json) { return Date1( name: json['name'] as String?, day: json['day'] as int?, month: json['month'] as int?, year: json['year'] as int?, time: json['time'] as String?, town: json['town'] as String?, country: json['country'], timeOffset: (json['timeOffset'] as num?)?.toDouble(), noTime: json['noTime'] as bool?, fullDate: json['fullDate'] as String?, selectedTown: json['selectedTown'] as bool?, fid: json['fid'], uid: json['uid'], lat: (json['lat'] as num?)?.toDouble(), lng: (json['lng'] as num?)?.toDouble(), mainUser: json['mainUser'] as bool?, ); } Map toJson() { return { 'name': name, 'day': day, 'month': month, 'year': year, 'time': time, 'town': town, 'country': country, 'timeOffset': timeOffset, 'noTime': noTime, 'fullDate': fullDate, 'selectedTown': selectedTown, 'fid': fid, 'uid': uid, 'lat': lat, 'lng': lng, 'mainUser': mainUser, }; } } class Date2 { final dynamic name; final int? day; final int? month; final int? year; final String? time; final dynamic town; final dynamic country; final double? timeOffset; final bool? noTime; final String? fullDate; final bool? selectedTown; final dynamic fid; final dynamic uid; final double? lat; final double? lng; final bool? mainUser; Date2({ this.name, this.day, this.month, this.year, this.time, this.town, this.country, this.timeOffset, this.noTime, this.fullDate, this.selectedTown, this.fid, this.uid, this.lat, this.lng, this.mainUser, }); factory Date2.fromJson(Map json) { return Date2( name: json['name'], day: json['day'] as int?, month: json['month'] as int?, year: json['year'] as int?, time: json['time'] as String?, town: json['town'], country: json['country'], timeOffset: (json['timeOffset'] as num?)?.toDouble(), noTime: json['noTime'] as bool?, fullDate: json['fullDate'] as String?, selectedTown: json['selectedTown'] as bool?, fid: json['fid'], uid: json['uid'], lat: (json['lat'] as num?)?.toDouble(), lng: (json['lng'] as num?)?.toDouble(), mainUser: json['mainUser'] as bool?, ); } Map toJson() { return { 'name': name, 'day': day, 'month': month, 'year': year, 'time': time, 'town': town, 'country': country, 'timeOffset': timeOffset, 'noTime': noTime, 'fullDate': fullDate, 'selectedTown': selectedTown, 'fid': fid, 'uid': uid, 'lat': lat, 'lng': lng, 'mainUser': mainUser, }; } } class Transitdate { final dynamic name; final int? day; final int? month; final int? year; final String? time; final dynamic town; final dynamic country; final double? timeOffset; final bool? noTime; final String? fullDate; final bool? selectedTown; final dynamic fid; final dynamic uid; final double? lat; final double? lng; final bool? mainUser; Transitdate({ this.name, this.day, this.month, this.year, this.time, this.town, this.country, this.timeOffset, this.noTime, this.fullDate, this.selectedTown, this.fid, this.uid, this.lat, this.lng, this.mainUser, }); factory Transitdate.fromJson(Map json) { return Transitdate( name: json['name'], day: json['day'] as int?, month: json['month'] as int?, year: json['year'] as int?, time: json['time'] as String?, town: json['town'], country: json['country'], timeOffset: (json['timeOffset'] as num?)?.toDouble(), noTime: json['noTime'] as bool?, fullDate: json['fullDate'] as String?, selectedTown: json['selectedTown'] as bool?, fid: json['fid'], uid: json['uid'], lat: (json['lat'] as num?)?.toDouble(), lng: (json['lng'] as num?)?.toDouble(), mainUser: json['mainUser'] as bool?, ); } Map toJson() { return { 'name': name, 'day': day, 'month': month, 'year': year, 'time': time, 'town': town, 'country': country, 'timeOffset': timeOffset, 'noTime': noTime, 'fullDate': fullDate, 'selectedTown': selectedTown, 'fid': fid, 'uid': uid, 'lat': lat, 'lng': lng, 'mainUser': mainUser, }; } } class Astrodate { final String? dt; final String? lat; final String? lng; final dynamic error; final int? errorCode; Astrodate({ this.dt, this.lat, this.lng, this.error, this.errorCode, }); factory Astrodate.fromJson(Map json) { return Astrodate( dt: json['dt'] as String?, lat: json['lat'] as String?, lng: json['lng'] as String?, error: json['error'], errorCode: json['errorCode'] as int?, ); } Map toJson() { return { 'dt': dt, 'lat': lat, 'lng': lng, 'error': error, 'errorCode': errorCode, }; } } final String? famous; final String? uid; final String? fid; final String? constraints; final bool? smartorb; final bool? mobile; final String? version; final bool? descriptions; final bool? full; final bool? basic; final Date1? date1; final Date2? date2; final Transitdate? transitDate; final dynamic extra; final String? typename; final String? type; final String? houseSystem; final bool? sidereal; final bool? saveData; final String? transitTime; final int? syn; final Astrodate? astroDate; final bool? isReport; final bool? getPatterns; Info({ this.famous, this.uid, this.fid, this.constraints, this.smartorb, this.mobile, this.version, this.descriptions, this.full, this.basic, this.date1, this.date2, this.transitDate, this.extra, this.typename, this.type, this.houseSystem, this.sidereal, this.saveData, this.transitTime, this.syn, this.astroDate, this.isReport, this.getPatterns, }); factory Info.fromJson(Map json) { return Info( famous: json['famous'] as String?, uid: json['uid'] as String?, fid: json['fid'] as String?, constraints: json['constraints'] as String?, smartorb: json['smartorb'] as bool?, mobile: json['mobile'] as bool?, version: json['version'] as String?, descriptions: json['descriptions'] as bool?, full: json['full'] as bool?, basic: json['basic'] as bool?, date1: json['date1'] != null ? Date1.fromJson(json['date1'] as Map) : null, date2: json['date2'] != null ? Date2.fromJson(json['date2'] as Map) : null, transitDate: json['transitDate'] != null ? Transitdate.fromJson(json['transitDate'] as Map) : null, extra: json['extra'], typename: json['typename'] as String?, type: json['type'] as String?, houseSystem: json['houseSystem'] as String?, sidereal: json['sidereal'] as bool?, saveData: json['saveData'] as bool?, transitTime: json['transitTime'] as String?, syn: json['syn'] as int?, astroDate: json['astroDate'] != null ? Astrodate.fromJson(json['astroDate'] as Map) : null, isReport: json['isReport'] as bool?, getPatterns: json['getPatterns'] as bool?, ); } Map toJson() { return { 'famous': famous, 'uid': uid, 'fid': fid, 'constraints': constraints, 'smartorb': smartorb, 'mobile': mobile, 'version': version, 'descriptions': descriptions, 'full': full, 'basic': basic, 'date1': date1?.toJson(), 'date2': date2?.toJson(), 'transitDate': transitDate?.toJson(), 'extra': extra, 'typename': typename, 'type': type, 'houseSystem': houseSystem, 'sidereal': sidereal, 'saveData': saveData, 'transitTime': transitTime, 'syn': syn, 'astroDate': astroDate?.toJson(), 'isReport': isReport, 'getPatterns': getPatterns, }; } } class Mayan { class Kin { final int? value; final String? name; final String? maya; Kin({ this.value, this.name, this.maya, }); factory Kin.fromJson(Map json) { return Kin( value: json['Value'] as int?, name: json['Name'] as String?, maya: json['Maya'] as String?, ); } Map toJson() { return { 'Value': value, 'Name': name, 'Maya': maya, }; } } class Tone { final int? value; final String? name; final String? maya; Tone({ this.value, this.name, this.maya, }); factory Tone.fromJson(Map json) { return Tone( value: json['Value'] as int?, name: json['Name'] as String?, maya: json['Maya'] as String?, ); } Map toJson() { return { 'Value': value, 'Name': name, 'Maya': maya, }; } } final Kin? kin; final Tone? tone; Mayan({ this.kin, this.tone, }); factory Mayan.fromJson(Map json) { return Mayan( kin: json['Kin'] != null ? Kin.fromJson(json['Kin'] as Map) : null, tone: json['Tone'] != null ? Tone.fromJson(json['Tone'] as Map) : null, ); } Map toJson() { return { 'Kin': kin?.toJson(), 'Tone': tone?.toJson(), }; } } class Profection { class Profectionyear { final String? component; final String? category; final dynamic description; final dynamic items; final dynamic image; final dynamic phrase; final dynamic iD; final dynamic beginDate; final dynamic endDate; final dynamic beginsStr; final dynamic endsStr; final dynamic ends; final dynamic degree; final dynamic sign; final dynamic url; final dynamic shortDesc; final int? percentComplete; Profectionyear({ this.component, this.category, this.description, this.items, this.image, this.phrase, this.iD, this.beginDate, this.endDate, this.beginsStr, this.endsStr, this.ends, this.degree, this.sign, this.url, this.shortDesc, this.percentComplete, }); factory Profectionyear.fromJson(Map json) { return Profectionyear( component: json['Component'] as String?, category: json['Category'] as String?, description: json['Description'], items: json['Items'], image: json['Image'], phrase: json['Phrase'], iD: json['ID'], beginDate: json['BeginDate'], endDate: json['EndDate'], beginsStr: json['BeginsStr'], endsStr: json['EndsStr'], ends: json['Ends'], degree: json['Degree'], sign: json['Sign'], url: json['Url'], shortDesc: json['ShortDesc'], percentComplete: json['PercentComplete'] as int?, ); } Map toJson() { return { 'Component': component, 'Category': category, 'Description': description, 'Items': items, 'Image': image, 'Phrase': phrase, 'ID': iD, 'BeginDate': beginDate, 'EndDate': endDate, 'BeginsStr': beginsStr, 'EndsStr': endsStr, 'Ends': ends, 'Degree': degree, 'Sign': sign, 'Url': url, 'ShortDesc': shortDesc, 'PercentComplete': percentComplete, }; } } class Timelord { final String? component; final String? category; final dynamic description; final dynamic items; final dynamic image; final dynamic phrase; final dynamic iD; final dynamic beginDate; final dynamic endDate; final dynamic beginsStr; final dynamic endsStr; final dynamic ends; final dynamic degree; final dynamic sign; final dynamic url; final dynamic shortDesc; final int? percentComplete; Timelord({ this.component, this.category, this.description, this.items, this.image, this.phrase, this.iD, this.beginDate, this.endDate, this.beginsStr, this.endsStr, this.ends, this.degree, this.sign, this.url, this.shortDesc, this.percentComplete, }); factory Timelord.fromJson(Map json) { return Timelord( component: json['Component'] as String?, category: json['Category'] as String?, description: json['Description'], items: json['Items'], image: json['Image'], phrase: json['Phrase'], iD: json['ID'], beginDate: json['BeginDate'], endDate: json['EndDate'], beginsStr: json['BeginsStr'], endsStr: json['EndsStr'], ends: json['Ends'], degree: json['Degree'], sign: json['Sign'], url: json['Url'], shortDesc: json['ShortDesc'], percentComplete: json['PercentComplete'] as int?, ); } Map toJson() { return { 'Component': component, 'Category': category, 'Description': description, 'Items': items, 'Image': image, 'Phrase': phrase, 'ID': iD, 'BeginDate': beginDate, 'EndDate': endDate, 'BeginsStr': beginsStr, 'EndsStr': endsStr, 'Ends': ends, 'Degree': degree, 'Sign': sign, 'Url': url, 'ShortDesc': shortDesc, 'PercentComplete': percentComplete, }; } } class Age { final String? component; final String? category; final dynamic description; final dynamic items; final dynamic image; final dynamic phrase; final dynamic iD; final dynamic beginDate; final dynamic endDate; final dynamic beginsStr; final dynamic endsStr; final dynamic ends; final dynamic degree; final dynamic sign; final dynamic url; final dynamic shortDesc; final int? percentComplete; Age({ this.component, this.category, this.description, this.items, this.image, this.phrase, this.iD, this.beginDate, this.endDate, this.beginsStr, this.endsStr, this.ends, this.degree, this.sign, this.url, this.shortDesc, this.percentComplete, }); factory Age.fromJson(Map json) { return Age( component: json['Component'] as String?, category: json['Category'] as String?, description: json['Description'], items: json['Items'], image: json['Image'], phrase: json['Phrase'], iD: json['ID'], beginDate: json['BeginDate'], endDate: json['EndDate'], beginsStr: json['BeginsStr'], endsStr: json['EndsStr'], ends: json['Ends'], degree: json['Degree'], sign: json['Sign'], url: json['Url'], shortDesc: json['ShortDesc'], percentComplete: json['PercentComplete'] as int?, ); } Map toJson() { return { 'Component': component, 'Category': category, 'Description': description, 'Items': items, 'Image': image, 'Phrase': phrase, 'ID': iD, 'BeginDate': beginDate, 'EndDate': endDate, 'BeginsStr': beginsStr, 'EndsStr': endsStr, 'Ends': ends, 'Degree': degree, 'Sign': sign, 'Url': url, 'ShortDesc': shortDesc, 'PercentComplete': percentComplete, }; } } final Profectionyear? profectionYear; final Timelord? timeLord; final Age? age; Profection({ this.profectionYear, this.timeLord, this.age, }); factory Profection.fromJson(Map json) { return Profection( profectionYear: json['profectionYear'] != null ? Profectionyear.fromJson(json['profectionYear'] as Map) : null, timeLord: json['timeLord'] != null ? Timelord.fromJson(json['timeLord'] as Map) : null, age: json['age'] != null ? Age.fromJson(json['age'] as Map) : null, ); } Map toJson() { return { 'profectionYear': profectionYear?.toJson(), 'timeLord': timeLord?.toJson(), 'age': age?.toJson(), }; } } class Forecast { final int? eventID; final String? begins; final String? ends; final String? title; final String? sign; final dynamic degree; final String? type; final String? description; final String? image; final String? phrase; final String? url; final String? fullTitle; final dynamic notify; final dynamic subType; final dynamic report; final dynamic shortDesc; final dynamic preShadow; final dynamic postShadow; final dynamic endDegree; Forecast({ this.eventID, this.begins, this.ends, this.title, this.sign, this.degree, this.type, this.description, this.image, this.phrase, this.url, this.fullTitle, this.notify, this.subType, this.report, this.shortDesc, this.preShadow, this.postShadow, this.endDegree, }); factory Forecast.fromJson(Map json) { return Forecast( eventID: json['EventID'] as int?, begins: json['Begins'] as String?, ends: json['Ends'] as String?, title: json['Title'] as String?, sign: json['Sign'] as String?, degree: json['Degree'], type: json['Type'] as String?, description: json['Description'] as String?, image: json['Image'] as String?, phrase: json['Phrase'] as String?, url: json['Url'] as String?, fullTitle: json['FullTitle'] as String?, notify: json['Notify'], subType: json['SubType'], report: json['Report'], shortDesc: json['ShortDesc'], preShadow: json['PreShadow'], postShadow: json['PostShadow'], endDegree: json['EndDegree'], ); } Map toJson() { return { 'EventID': eventID, 'Begins': begins, 'Ends': ends, 'Title': title, 'Sign': sign, 'Degree': degree, 'Type': type, 'Description': description, 'Image': image, 'Phrase': phrase, 'Url': url, 'FullTitle': fullTitle, 'Notify': notify, 'SubType': subType, 'Report': report, 'ShortDesc': shortDesc, 'PreShadow': preShadow, 'PostShadow': postShadow, 'EndDegree': endDegree, }; } } class Psychologyshort { class Pattern { final String? name; final String? negName; final String? posName; final int? count; final int? negative; final int? positive; final int? negativePercent; final int? positivePercent; Pattern({ this.name, this.negName, this.posName, this.count, this.negative, this.positive, this.negativePercent, this.positivePercent, }); factory Pattern.fromJson(Map json) { return Pattern( name: json['Name'] as String?, negName: json['NegName'] as String?, posName: json['PosName'] as String?, count: json['Count'] as int?, negative: json['Negative'] as int?, positive: json['Positive'] as int?, negativePercent: json['NegativePercent'] as int?, positivePercent: json['PositivePercent'] as int?, ); } Map toJson() { return { 'Name': name, 'NegName': negName, 'PosName': posName, 'Count': count, 'Negative': negative, 'Positive': positive, 'NegativePercent': negativePercent, 'PositivePercent': positivePercent, }; } } class Enneagram { final String? name; final dynamic negName; final dynamic posName; final int? count; final int? negative; final int? positive; final int? negativePercent; final int? positivePercent; Enneagram({ this.name, this.negName, this.posName, this.count, this.negative, this.positive, this.negativePercent, this.positivePercent, }); factory Enneagram.fromJson(Map json) { return Enneagram( name: json['Name'] as String?, negName: json['NegName'], posName: json['PosName'], count: json['Count'] as int?, negative: json['Negative'] as int?, positive: json['Positive'] as int?, negativePercent: json['NegativePercent'] as int?, positivePercent: json['PositivePercent'] as int?, ); } Map toJson() { return { 'Name': name, 'NegName': negName, 'PosName': posName, 'Count': count, 'Negative': negative, 'Positive': positive, 'NegativePercent': negativePercent, 'PositivePercent': positivePercent, }; } } final dynamic mBTI; final List mBTICount; final List patterns; final List archtypes; final List enneagrams; Psychologyshort({ this.mBTI, this.mBTICount, this.patterns, this.archtypes, this.enneagrams, }); factory Psychologyshort.fromJson(Map json) { return Psychologyshort( mBTI: json['MBTI'], mBTICount: (json['MBTICount'] as List?)?.cast(), patterns: (json['Patterns'] as List?)?.map((e) => Pattern.fromJson(e as Map)).toList(), archtypes: (json['Archtypes'] as List?)?.cast(), enneagrams: (json['Enneagrams'] as List?)?.map((e) => Enneagram.fromJson(e as Map)).toList(), ); } Map toJson() { return { 'MBTI': mBTI, 'MBTICount': mBTICount, 'Patterns': patterns?.map((e) => e.toJson()).toList(), 'Archtypes': archtypes, 'Enneagrams': enneagrams?.map((e) => e.toJson()).toList(), }; } } class Psychologylong { final dynamic mBTI; final List mBTICount; final List patterns; final List archtypes; final List enneagrams; Psychologylong({ this.mBTI, this.mBTICount, this.patterns, this.archtypes, this.enneagrams, }); factory Psychologylong.fromJson(Map json) { return Psychologylong( mBTI: json['MBTI'], mBTICount: (json['MBTICount'] as List?)?.cast(), patterns: (json['Patterns'] as List?)?.map((e) => Pattern.fromJson(e as Map)).toList(), archtypes: (json['Archtypes'] as List?)?.cast(), enneagrams: (json['Enneagrams'] as List?)?.map((e) => Enneagram.fromJson(e as Map)).toList(), ); } Map toJson() { return { 'MBTI': mBTI, 'MBTICount': mBTICount, 'Patterns': patterns?.map((e) => e.toJson()).toList(), 'Archtypes': archtypes, 'Enneagrams': enneagrams?.map((e) => e.toJson()).toList(), }; } } class Facet { final String? name; final dynamic negName; final dynamic posName; final int? count; final int? negative; final int? positive; final int? negativePercent; final int? positivePercent; Facet({ this.name, this.negName, this.posName, this.count, this.negative, this.positive, this.negativePercent, this.positivePercent, }); factory Facet.fromJson(Map json) { return Facet( name: json['Name'] as String?, negName: json['NegName'], posName: json['PosName'], count: json['Count'] as int?, negative: json['Negative'] as int?, positive: json['Positive'] as int?, negativePercent: json['NegativePercent'] as int?, positivePercent: json['PositivePercent'] as int?, ); } Map toJson() { return { 'Name': name, 'NegName': negName, 'PosName': posName, 'Count': count, 'Negative': negative, 'Positive': positive, 'NegativePercent': negativePercent, 'PositivePercent': positivePercent, }; } } class Planet { class Extra { class Hd { class Iching { final String? name; final String? theme; final String? shadow; final String? gift; final String? siddhi; Iching({ this.name, this.theme, this.shadow, this.gift, this.siddhi, }); factory Iching.fromJson(Map json) { return Iching( name: json['Name'] as String?, theme: json['Theme'] as String?, shadow: json['Shadow'] as String?, gift: json['Gift'] as String?, siddhi: json['Siddhi'] as String?, ); } Map toJson() { return { 'Name': name, 'Theme': theme, 'Shadow': shadow, 'Gift': gift, 'Siddhi': siddhi, }; } } final int? gate; final String? center; final String? circuitry; final Iching? iChing; Hd({ this.gate, this.center, this.circuitry, this.iChing, }); factory Hd.fromJson(Map json) { return Hd( gate: json['Gate'] as int?, center: json['Center'] as String?, circuitry: json['Circuitry'] as String?, iChing: json['IChing'] != null ? Iching.fromJson(json['IChing'] as Map) : null, ); } Map toJson() { return { 'Gate': gate, 'Center': center, 'Circuitry': circuitry, 'IChing': iChing?.toJson(), }; } } final String? decan; final String? degree; final String? sign; final String? sabian; final String? tarot; final dynamic tarotDescription; final dynamic decanDescription; final dynamic criticalType; final dynamic criticalDescription; final String? virtue; final Hd? hd; Extra({ this.decan, this.degree, this.sign, this.sabian, this.tarot, this.tarotDescription, this.decanDescription, this.criticalType, this.criticalDescription, this.virtue, this.hd, }); factory Extra.fromJson(Map json) { return Extra( decan: json['decan'] as String?, degree: json['degree'] as String?, sign: json['sign'] as String?, sabian: json['sabian'] as String?, tarot: json['tarot'] as String?, tarotDescription: json['tarotDescription'], decanDescription: json['decanDescription'], criticalType: json['criticalType'], criticalDescription: json['criticalDescription'], virtue: json['virtue'] as String?, hd: json['hd'] != null ? Hd.fromJson(json['hd'] as Map) : null, ); } Map toJson() { return { 'decan': decan, 'degree': degree, 'sign': sign, 'sabian': sabian, 'tarot': tarot, 'tarotDescription': tarotDescription, 'decanDescription': decanDescription, 'criticalType': criticalType, 'criticalDescription': criticalDescription, 'virtue': virtue, 'hd': hd?.toJson(), }; } } final int? house; final int? transitHouse; final String? sign; final String? planet; final double? degree; final double? declination; final double? distance; final double? apoperigee; final double? relativeDegree; final dynamic quote; final dynamic quoteAuthor; final bool? retrograde; final dynamic element; final dynamic phrase; final dynamic sabian; final List traits; final List principles; final List relationshipTypes; final dynamic jSON; final dynamic houseJSON; final String? transitHouseBegins; final String? transitHouseEnds; final int? duration; final dynamic tarot; final Extra? extra; final String? signDescription; final String? houseDescription; Planet({ this.house, this.transitHouse, this.sign, this.planet, this.degree, this.declination, this.distance, this.apoperigee, this.relativeDegree, this.quote, this.quoteAuthor, this.retrograde, this.element, this.phrase, this.sabian, this.traits, this.principles, this.relationshipTypes, this.jSON, this.houseJSON, this.transitHouseBegins, this.transitHouseEnds, this.duration, this.tarot, this.extra, this.signDescription, this.houseDescription, }); factory Planet.fromJson(Map json) { return Planet( house: json['house'] as int?, transitHouse: json['transitHouse'] as int?, sign: json['sign'] as String?, planet: json['planet'] as String?, degree: (json['degree'] as num?)?.toDouble(), declination: (json['declination'] as num?)?.toDouble(), distance: (json['distance'] as num?)?.toDouble(), apoperigee: (json['apoperigee'] as num?)?.toDouble(), relativeDegree: (json['relativeDegree'] as num?)?.toDouble(), quote: json['quote'], quoteAuthor: json['quoteAuthor'], retrograde: json['retrograde'] as bool?, element: json['element'], phrase: json['phrase'], sabian: json['sabian'], traits: (json['traits'] as List?)?.cast(), principles: (json['principles'] as List?)?.cast(), relationshipTypes: (json['relationshipTypes'] as List?)?.cast(), jSON: json['JSON'], houseJSON: json['houseJSON'], transitHouseBegins: json['transitHouseBegins'] as String?, transitHouseEnds: json['transitHouseEnds'] as String?, duration: json['duration'] as int?, tarot: json['tarot'], extra: json['extra'] != null ? Extra.fromJson(json['extra'] as Map) : null, signDescription: json['signDescription'] as String?, houseDescription: json['houseDescription'] as String?, ); } Map toJson() { return { 'house': house, 'transitHouse': transitHouse, 'sign': sign, 'planet': planet, 'degree': degree, 'declination': declination, 'distance': distance, 'apoperigee': apoperigee, 'relativeDegree': relativeDegree, 'quote': quote, 'quoteAuthor': quoteAuthor, 'retrograde': retrograde, 'element': element, 'phrase': phrase, 'sabian': sabian, 'traits': traits, 'principles': principles, 'relationshipTypes': relationshipTypes, 'JSON': jSON, 'houseJSON': houseJSON, 'transitHouseBegins': transitHouseBegins, 'transitHouseEnds': transitHouseEnds, 'duration': duration, 'tarot': tarot, 'extra': extra?.toJson(), 'signDescription': signDescription, 'houseDescription': houseDescription, }; } } class Extendedmooninfo { class Mooninfo { final String? sign; final String? type; final int? intType; final int? segment; final double? degree; final String? nextMoon; final dynamic sun; final String? mercury; final String? venus; final String? moonVoid; final dynamic moon; final dynamic day; final dynamic month; final dynamic year; final dynamic fullDate; final String? degreeString; final String? phrase; final double? distance; final double? percentPerigee; final dynamic planets; Mooninfo({ this.sign, this.type, this.intType, this.segment, this.degree, this.nextMoon, this.sun, this.mercury, this.venus, this.moonVoid, this.moon, this.day, this.month, this.year, this.fullDate, this.degreeString, this.phrase, this.distance, this.percentPerigee, this.planets, }); factory Mooninfo.fromJson(Map json) { return Mooninfo( sign: json['Sign'] as String?, type: json['Type'] as String?, intType: json['IntType'] as int?, segment: json['Segment'] as int?, degree: (json['Degree'] as num?)?.toDouble(), nextMoon: json['NextMoon'] as String?, sun: json['Sun'], mercury: json['Mercury'] as String?, venus: json['Venus'] as String?, moonVoid: json['MoonVoid'] as String?, moon: json['Moon'], day: json['Day'], month: json['Month'], year: json['Year'], fullDate: json['FullDate'], degreeString: json['DegreeString'] as String?, phrase: json['Phrase'] as String?, distance: (json['Distance'] as num?)?.toDouble(), percentPerigee: (json['PercentPerigee'] as num?)?.toDouble(), planets: json['planets'], ); } Map toJson() { return { 'Sign': sign, 'Type': type, 'IntType': intType, 'Segment': segment, 'Degree': degree, 'NextMoon': nextMoon, 'Sun': sun, 'Mercury': mercury, 'Venus': venus, 'MoonVoid': moonVoid, 'Moon': moon, 'Day': day, 'Month': month, 'Year': year, 'FullDate': fullDate, 'DegreeString': degreeString, 'Phrase': phrase, 'Distance': distance, 'PercentPerigee': percentPerigee, 'planets': planets, }; } } class Degree { final dynamic decan; final dynamic degree; final dynamic sign; final dynamic sabian; final dynamic tarot; final dynamic tarotDescription; final dynamic decanDescription; final dynamic criticalType; final dynamic criticalDescription; final dynamic virtue; final Hd? hd; Degree({ this.decan, this.degree, this.sign, this.sabian, this.tarot, this.tarotDescription, this.decanDescription, this.criticalType, this.criticalDescription, this.virtue, this.hd, }); factory Degree.fromJson(Map json) { return Degree( decan: json['decan'], degree: json['degree'], sign: json['sign'], sabian: json['sabian'], tarot: json['tarot'], tarotDescription: json['tarotDescription'], decanDescription: json['decanDescription'], criticalType: json['criticalType'], criticalDescription: json['criticalDescription'], virtue: json['virtue'], hd: json['hd'] != null ? Hd.fromJson(json['hd'] as Map) : null, ); } Map toJson() { return { 'decan': decan, 'degree': degree, 'sign': sign, 'sabian': sabian, 'tarot': tarot, 'tarotDescription': tarotDescription, 'decanDescription': decanDescription, 'criticalType': criticalType, 'criticalDescription': criticalDescription, 'virtue': virtue, 'hd': hd?.toJson(), }; } } class Nextmoon { final String? _id; final int? eventID; final String? begins; final String? ends; final dynamic preShadow; final dynamic postShadow; final dynamic endDegree; final String? title; final String? sign; final dynamic degree; final String? type; final String? image; final String? phrase; final String? url; final String? fullTitle; final int? subType; final dynamic report; final String? fullUrl; final dynamic blurb; final int? notify; final int? __v; Nextmoon({ this._id, this.eventID, this.begins, this.ends, this.preShadow, this.postShadow, this.endDegree, this.title, this.sign, this.degree, this.type, this.image, this.phrase, this.url, this.fullTitle, this.subType, this.report, this.fullUrl, this.blurb, this.notify, this.__v, }); factory Nextmoon.fromJson(Map json) { return Nextmoon( _id: json['_id'] as String?, eventID: json['EventID'] as int?, begins: json['Begins'] as String?, ends: json['Ends'] as String?, preShadow: json['PreShadow'], postShadow: json['PostShadow'], endDegree: json['EndDegree'], title: json['Title'] as String?, sign: json['Sign'] as String?, degree: json['Degree'], type: json['Type'] as String?, image: json['Image'] as String?, phrase: json['Phrase'] as String?, url: json['Url'] as String?, fullTitle: json['FullTitle'] as String?, subType: json['SubType'] as int?, report: json['Report'], fullUrl: json['FullUrl'] as String?, blurb: json['Blurb'], notify: json['Notify'] as int?, __v: json['__v'] as int?, ); } Map toJson() { return { '_id': _id, 'EventID': eventID, 'Begins': begins, 'Ends': ends, 'PreShadow': preShadow, 'PostShadow': postShadow, 'EndDegree': endDegree, 'Title': title, 'Sign': sign, 'Degree': degree, 'Type': type, 'Image': image, 'Phrase': phrase, 'Url': url, 'FullTitle': fullTitle, 'SubType': subType, 'Report': report, 'FullUrl': fullUrl, 'Blurb': blurb, 'Notify': notify, '__v': __v, }; } } class Nextlunar { final String? _id; final int? eventID; final String? begins; final dynamic ends; final dynamic preShadow; final dynamic postShadow; final dynamic endDegree; final String? title; final String? sign; final double? degree; final String? type; final String? image; final String? phrase; final String? url; final String? fullTitle; final int? subType; final String? report; final String? fullUrl; final String? blurb; final int? notify; final int? __v; Nextlunar({ this._id, this.eventID, this.begins, this.ends, this.preShadow, this.postShadow, this.endDegree, this.title, this.sign, this.degree, this.type, this.image, this.phrase, this.url, this.fullTitle, this.subType, this.report, this.fullUrl, this.blurb, this.notify, this.__v, }); factory Nextlunar.fromJson(Map json) { return Nextlunar( _id: json['_id'] as String?, eventID: json['EventID'] as int?, begins: json['Begins'] as String?, ends: json['Ends'], preShadow: json['PreShadow'], postShadow: json['PostShadow'], endDegree: json['EndDegree'], title: json['Title'] as String?, sign: json['Sign'] as String?, degree: (json['Degree'] as num?)?.toDouble(), type: json['Type'] as String?, image: json['Image'] as String?, phrase: json['Phrase'] as String?, url: json['Url'] as String?, fullTitle: json['FullTitle'] as String?, subType: json['SubType'] as int?, report: json['Report'] as String?, fullUrl: json['FullUrl'] as String?, blurb: json['Blurb'] as String?, notify: json['Notify'] as int?, __v: json['__v'] as int?, ); } Map toJson() { return { '_id': _id, 'EventID': eventID, 'Begins': begins, 'Ends': ends, 'PreShadow': preShadow, 'PostShadow': postShadow, 'EndDegree': endDegree, 'Title': title, 'Sign': sign, 'Degree': degree, 'Type': type, 'Image': image, 'Phrase': phrase, 'Url': url, 'FullTitle': fullTitle, 'SubType': subType, 'Report': report, 'FullUrl': fullUrl, 'Blurb': blurb, 'Notify': notify, '__v': __v, }; } } final Mooninfo? moonInfo; final String? moonString; final String? moonImage; final String? voidString; final String? oobString; final String? oOBBegins; final String? oOBEnds; final String? vOCBegins; final String? vOCEnds; final List lastAspect; final String? nextMoonDate; final String? nextLunarDate; final Degree? degree; final Nextmoon? nextMoon; final Nextlunar? nextLunar; Extendedmooninfo({ this.moonInfo, this.moonString, this.moonImage, this.voidString, this.oobString, this.oOBBegins, this.oOBEnds, this.vOCBegins, this.vOCEnds, this.lastAspect, this.nextMoonDate, this.nextLunarDate, this.degree, this.nextMoon, this.nextLunar, }); factory Extendedmooninfo.fromJson(Map json) { return Extendedmooninfo( moonInfo: json['moonInfo'] != null ? Mooninfo.fromJson(json['moonInfo'] as Map) : null, moonString: json['moonString'] as String?, moonImage: json['moonImage'] as String?, voidString: json['voidString'] as String?, oobString: json['oobString'] as String?, oOBBegins: json['OOBBegins'] as String?, oOBEnds: json['OOBEnds'] as String?, vOCBegins: json['VOCBegins'] as String?, vOCEnds: json['VOCEnds'] as String?, lastAspect: (json['lastAspect'] as List?)?.cast(), nextMoonDate: json['nextMoonDate'] as String?, nextLunarDate: json['nextLunarDate'] as String?, degree: json['degree'] != null ? Degree.fromJson(json['degree'] as Map) : null, nextMoon: json['nextMoon'] != null ? Nextmoon.fromJson(json['nextMoon'] as Map) : null, nextLunar: json['nextLunar'] != null ? Nextlunar.fromJson(json['nextLunar'] as Map) : null, ); } Map toJson() { return { 'moonInfo': moonInfo?.toJson(), 'moonString': moonString, 'moonImage': moonImage, 'voidString': voidString, 'oobString': oobString, 'OOBBegins': oOBBegins, 'OOBEnds': oOBEnds, 'VOCBegins': vOCBegins, 'VOCEnds': vOCEnds, 'lastAspect': lastAspect, 'nextMoonDate': nextMoonDate, 'nextLunarDate': nextLunarDate, 'degree': degree?.toJson(), 'nextMoon': nextMoon?.toJson(), 'nextLunar': nextLunar?.toJson(), }; } } class Planethourinfo { class Planethour { final String? name; final String? start; final String? end; Planethour({ this.name, this.start, this.end, }); factory Planethour.fromJson(Map json) { return Planethour( name: json['Name'] as String?, start: json['Start'] as String?, end: json['End'] as String?, ); } Map toJson() { return { 'Name': name, 'Start': start, 'End': end, }; } } final List planetHours; final dynamic day; final String? night; final int? hourRulerIndex; final String? date; final String? dayRuler; final String? hourRuler; final String? sunrise; final String? sunset; final String? moonrise; final String? moonset; final String? hourRulerBegin; final String? hourRulerEnd; Planethourinfo({ this.planetHours, this.day, this.night, this.hourRulerIndex, this.date, this.dayRuler, this.hourRuler, this.sunrise, this.sunset, this.moonrise, this.moonset, this.hourRulerBegin, this.hourRulerEnd, }); factory Planethourinfo.fromJson(Map json) { return Planethourinfo( planetHours: (json['PlanetHours'] as List?)?.map((e) => Planethour.fromJson(e as Map)).toList(), day: json['Day'], night: json['Night'] as String?, hourRulerIndex: json['HourRulerIndex'] as int?, date: json['Date'] as String?, dayRuler: json['DayRuler'] as String?, hourRuler: json['HourRuler'] as String?, sunrise: json['Sunrise'] as String?, sunset: json['Sunset'] as String?, moonrise: json['Moonrise'] as String?, moonset: json['Moonset'] as String?, hourRulerBegin: json['HourRulerBegin'] as String?, hourRulerEnd: json['HourRulerEnd'] as String?, ); } Map toJson() { return { 'PlanetHours': planetHours?.map((e) => e.toJson()).toList(), 'Day': day, 'Night': night, 'HourRulerIndex': hourRulerIndex, 'Date': date, 'DayRuler': dayRuler, 'HourRuler': hourRuler, 'Sunrise': sunrise, 'Sunset': sunset, 'Moonrise': moonrise, 'Moonset': moonset, 'HourRulerBegin': hourRulerBegin, 'HourRulerEnd': hourRulerEnd, }; } } class Lifepath { final int? numerologyID; final String? title; final String? description; final int? path; final dynamic image; final dynamic phrase; final String? type; final String? tarot; final String? tarotCategory; final String? tarotNumber; Lifepath({ this.numerologyID, this.title, this.description, this.path, this.image, this.phrase, this.type, this.tarot, this.tarotCategory, this.tarotNumber, }); factory Lifepath.fromJson(Map json) { return Lifepath( numerologyID: json['NumerologyID'] as int?, title: json['Title'] as String?, description: json['Description'] as String?, path: json['Path'] as int?, image: json['Image'], phrase: json['Phrase'], type: json['Type'] as String?, tarot: json['Tarot'] as String?, tarotCategory: json['TarotCategory'] as String?, tarotNumber: json['TarotNumber'] as String?, ); } Map toJson() { return { 'NumerologyID': numerologyID, 'Title': title, 'Description': description, 'Path': path, 'Image': image, 'Phrase': phrase, 'Type': type, 'Tarot': tarot, 'TarotCategory': tarotCategory, 'TarotNumber': tarotNumber, }; } } class Chakra { final int? count; final double? ratio; final String? name; final int? positiveCount; final int? negativeCount; final double? balance; Chakra({ this.count, this.ratio, this.name, this.positiveCount, this.negativeCount, this.balance, }); factory Chakra.fromJson(Map json) { return Chakra( count: json['Count'] as int?, ratio: (json['Ratio'] as num?)?.toDouble(), name: json['Name'] as String?, positiveCount: json['PositiveCount'] as int?, negativeCount: json['NegativeCount'] as int?, balance: (json['Balance'] as num?)?.toDouble(), ); } Map toJson() { return { 'Count': count, 'Ratio': ratio, 'Name': name, 'PositiveCount': positiveCount, 'NegativeCount': negativeCount, 'Balance': balance, }; } } final List cache; final List traits; final List errors; final String? calculatedDate; final List aspectFormations; final List planetReturns; final String? chartDate; final Info? info; final Mayan? mayan; final Profection? profections; final List forecasts; final Psychologyshort? psychologyShort; final Psychologylong? psychologyLong; final List facets; final List sections; final List planets; final Extendedmooninfo? extendedMoonInfo; final Planethourinfo? planetHourInfo; final Lifepath? lifePath; final List chakras; Chart({ this.cache, this.traits, this.errors, this.calculatedDate, this.aspectFormations, this.planetReturns, this.chartDate, this.info, this.mayan, this.profections, this.forecasts, this.psychologyShort, this.psychologyLong, this.facets, this.sections, this.planets, this.extendedMoonInfo, this.planetHourInfo, this.lifePath, this.chakras, }); factory Chart.fromJson(Map json) { return Chart( cache: (json['cache'] as List?)?.map((e) => Cache.fromJson(e as Map)).toList(), traits: (json['traits'] as List?)?.cast(), errors: (json['errors'] as List?)?.cast(), calculatedDate: json['calculatedDate'] as String?, aspectFormations: (json['aspectFormations'] as List?)?.cast(), planetReturns: (json['planetReturns'] as List?)?.map((e) => Planetreturn.fromJson(e as Map)).toList(), chartDate: json['chartDate'] as String?, info: json['info'] != null ? Info.fromJson(json['info'] as Map) : null, mayan: json['mayan'] != null ? Mayan.fromJson(json['mayan'] as Map) : null, profections: json['profections'] != null ? Profection.fromJson(json['profections'] as Map) : null, forecasts: (json['forecasts'] as List?)?.map((e) => Forecast.fromJson(e as Map)).toList(), psychologyShort: json['psychologyShort'] != null ? Psychologyshort.fromJson(json['psychologyShort'] as Map) : null, psychologyLong: json['psychologyLong'] != null ? Psychologylong.fromJson(json['psychologyLong'] as Map) : null, facets: (json['facets'] as List?)?.map((e) => Facet.fromJson(e as Map)).toList(), sections: (json['sections'] as List?)?.cast(), planets: (json['planets'] as List?)?.map((e) => Planet.fromJson(e as Map)).toList(), extendedMoonInfo: json['extendedMoonInfo'] != null ? Extendedmooninfo.fromJson(json['extendedMoonInfo'] as Map) : null, planetHourInfo: json['planetHourInfo'] != null ? Planethourinfo.fromJson(json['planetHourInfo'] as Map) : null, lifePath: json['lifePath'] != null ? Lifepath.fromJson(json['lifePath'] as Map) : null, chakras: (json['chakras'] as List?)?.map((e) => Chakra.fromJson(e as Map)).toList(), ); } Map toJson() { return { 'cache': cache?.map((e) => e.toJson()).toList(), 'traits': traits, 'errors': errors, 'calculatedDate': calculatedDate, 'aspectFormations': aspectFormations, 'planetReturns': planetReturns?.map((e) => e.toJson()).toList(), 'chartDate': chartDate, 'info': info?.toJson(), 'mayan': mayan?.toJson(), 'profections': profections?.toJson(), 'forecasts': forecasts?.map((e) => e.toJson()).toList(), 'psychologyShort': psychologyShort?.toJson(), 'psychologyLong': psychologyLong?.toJson(), 'facets': facets?.map((e) => e.toJson()).toList(), 'sections': sections, 'planets': planets?.map((e) => e.toJson()).toList(), 'extendedMoonInfo': extendedMoonInfo?.toJson(), 'planetHourInfo': planetHourInfo?.toJson(), 'lifePath': lifePath?.toJson(), 'chakras': chakras?.map((e) => e.toJson()).toList(), }; } } final List charts; HoroscopeResponse({ this.charts, }); factory HoroscopeResponse.fromJson(Map json) { return HoroscopeResponse( charts: (json['charts'] as List?)?.map((e) => Chart.fromJson(e as Map)).toList(), ); } Map toJson() { return { 'charts': charts?.map((e) => e.toJson()).toList(), }; } } class ChartData { final List cache; final List traits; final List errors; final String? calculatedDate; final List aspectFormations; final List planetReturns; final String? chartDate; final Info? info; final Mayan? mayan; final Profection? profections; final List forecasts; final Psychologyshort? psychologyShort; final Psychologylong? psychologyLong; final List facets; final List sections; final List planets; final Extendedmooninfo? extendedMoonInfo; final Planethourinfo? planetHourInfo; final Lifepath? lifePath; final List chakras; ChartData({ this.cache, this.traits, this.errors, this.calculatedDate, this.aspectFormations, this.planetReturns, this.chartDate, this.info, this.mayan, this.profections, this.forecasts, this.psychologyShort, this.psychologyLong, this.facets, this.sections, this.planets, this.extendedMoonInfo, this.planetHourInfo, this.lifePath, this.chakras, }); factory ChartData.fromJson(Map json) { return ChartData( cache: (json['cache'] as List?)?.map((e) => Cache.fromJson(e as Map)).toList(), traits: (json['traits'] as List?)?.cast(), errors: (json['errors'] as List?)?.cast(), calculatedDate: json['calculatedDate'] as String?, aspectFormations: (json['aspectFormations'] as List?)?.cast(), planetReturns: (json['planetReturns'] as List?)?.map((e) => Planetreturn.fromJson(e as Map)).toList(), chartDate: json['chartDate'] as String?, info: json['info'] != null ? Info.fromJson(json['info'] as Map) : null, mayan: json['mayan'] != null ? Mayan.fromJson(json['mayan'] as Map) : null, profections: json['profections'] != null ? Profection.fromJson(json['profections'] as Map) : null, forecasts: (json['forecasts'] as List?)?.map((e) => Forecast.fromJson(e as Map)).toList(), psychologyShort: json['psychologyShort'] != null ? Psychologyshort.fromJson(json['psychologyShort'] as Map) : null, psychologyLong: json['psychologyLong'] != null ? Psychologylong.fromJson(json['psychologyLong'] as Map) : null, facets: (json['facets'] as List?)?.map((e) => Facet.fromJson(e as Map)).toList(), sections: (json['sections'] as List?)?.cast(), planets: (json['planets'] as List?)?.map((e) => Planet.fromJson(e as Map)).toList(), extendedMoonInfo: json['extendedMoonInfo'] != null ? Extendedmooninfo.fromJson(json['extendedMoonInfo'] as Map) : null, planetHourInfo: json['planetHourInfo'] != null ? Planethourinfo.fromJson(json['planetHourInfo'] as Map) : null, lifePath: json['lifePath'] != null ? Lifepath.fromJson(json['lifePath'] as Map) : null, chakras: (json['chakras'] as List?)?.map((e) => Chakra.fromJson(e as Map)).toList(), ); } Map toJson() { return { 'cache': cache?.map((e) => e.toJson()).toList(), 'traits': traits, 'errors': errors, 'calculatedDate': calculatedDate, 'aspectFormations': aspectFormations, 'planetReturns': planetReturns?.map((e) => e.toJson()).toList(), 'chartDate': chartDate, 'info': info?.toJson(), 'mayan': mayan?.toJson(), 'profections': profections?.toJson(), 'forecasts': forecasts?.map((e) => e.toJson()).toList(), 'psychologyShort': psychologyShort?.toJson(), 'psychologyLong': psychologyLong?.toJson(), 'facets': facets?.map((e) => e.toJson()).toList(), 'sections': sections, 'planets': planets?.map((e) => e.toJson()).toList(), 'extendedMoonInfo': extendedMoonInfo?.toJson(), 'planetHourInfo': planetHourInfo?.toJson(), 'lifePath': lifePath?.toJson(), 'chakras': chakras?.map((e) => e.toJson()).toList(), }; } } class CacheItem { final int? cacheID; final String? userID; final String? category; final String? component; final String? phrase; final String? begins; final String? ends; final dynamic exact; final String? type; final double? degree; final String? hash; final String? image; final String? created; final String? sign; final bool? retrograde; final double? declination; final int? percentComplete; final String? concept; final String? facet; final dynamic facet2; final String? opportunity; final String? pattern; final dynamic description; final Meta? meta; CacheItem({ this.cacheID, this.userID, this.category, this.component, this.phrase, this.begins, this.ends, this.exact, this.type, this.degree, this.hash, this.image, this.created, this.sign, this.retrograde, this.declination, this.percentComplete, this.concept, this.facet, this.facet2, this.opportunity, this.pattern, this.description, this.meta, }); factory CacheItem.fromJson(Map json) { return CacheItem( cacheID: json['CacheID'] as int?, userID: json['UserID'] as String?, category: json['Category'] as String?, component: json['Component'] as String?, phrase: json['Phrase'] as String?, begins: json['Begins'] as String?, ends: json['Ends'] as String?, exact: json['Exact'], type: json['Type'] as String?, degree: (json['Degree'] as num?)?.toDouble(), hash: json['Hash'] as String?, image: json['Image'] as String?, created: json['Created'] as String?, sign: json['Sign'] as String?, retrograde: json['Retrograde'] as bool?, declination: (json['Declination'] as num?)?.toDouble(), percentComplete: json['PercentComplete'] as int?, concept: json['Concept'] as String?, facet: json['Facet'] as String?, facet2: json['Facet2'], opportunity: json['Opportunity'] as String?, pattern: json['Pattern'] as String?, description: json['Description'], meta: json['meta'] != null ? Meta.fromJson(json['meta'] as Map) : null, ); } Map toJson() { return { 'CacheID': cacheID, 'UserID': userID, 'Category': category, 'Component': component, 'Phrase': phrase, 'Begins': begins, 'Ends': ends, 'Exact': exact, 'Type': type, 'Degree': degree, 'Hash': hash, 'Image': image, 'Created': created, 'Sign': sign, 'Retrograde': retrograde, 'Declination': declination, 'PercentComplete': percentComplete, 'Concept': concept, 'Facet': facet, 'Facet2': facet2, 'Opportunity': opportunity, 'Pattern': pattern, 'Description': description, 'meta': meta?.toJson(), }; } } class MayanData { final Kin? kin; final Tone? tone; MayanData({ this.kin, this.tone, }); factory MayanData.fromJson(Map json) { return MayanData( kin: json['Kin'] != null ? Kin.fromJson(json['Kin'] as Map) : null, tone: json['Tone'] != null ? Tone.fromJson(json['Tone'] as Map) : null, ); } Map toJson() { return { 'Kin': kin?.toJson(), 'Tone': tone?.toJson(), }; } } class ChartInfo { final String? famous; final String? uid; final String? fid; final String? constraints; final bool? smartorb; final bool? mobile; final String? version; final bool? descriptions; final bool? full; final bool? basic; final Date1? date1; final Date2? date2; final Transitdate? transitDate; final dynamic extra; final String? typename; final String? type; final String? houseSystem; final bool? sidereal; final bool? saveData; final String? transitTime; final int? syn; final Astrodate? astroDate; final bool? isReport; final bool? getPatterns; ChartInfo({ this.famous, this.uid, this.fid, this.constraints, this.smartorb, this.mobile, this.version, this.descriptions, this.full, this.basic, this.date1, this.date2, this.transitDate, this.extra, this.typename, this.type, this.houseSystem, this.sidereal, this.saveData, this.transitTime, this.syn, this.astroDate, this.isReport, this.getPatterns, }); factory ChartInfo.fromJson(Map json) { return ChartInfo( famous: json['famous'] as String?, uid: json['uid'] as String?, fid: json['fid'] as String?, constraints: json['constraints'] as String?, smartorb: json['smartorb'] as bool?, mobile: json['mobile'] as bool?, version: json['version'] as String?, descriptions: json['descriptions'] as bool?, full: json['full'] as bool?, basic: json['basic'] as bool?, date1: json['date1'] != null ? Date1.fromJson(json['date1'] as Map) : null, date2: json['date2'] != null ? Date2.fromJson(json['date2'] as Map) : null, transitDate: json['transitDate'] != null ? Transitdate.fromJson(json['transitDate'] as Map) : null, extra: json['extra'], typename: json['typename'] as String?, type: json['type'] as String?, houseSystem: json['houseSystem'] as String?, sidereal: json['sidereal'] as bool?, saveData: json['saveData'] as bool?, transitTime: json['transitTime'] as String?, syn: json['syn'] as int?, astroDate: json['astroDate'] != null ? Astrodate.fromJson(json['astroDate'] as Map) : null, isReport: json['isReport'] as bool?, getPatterns: json['getPatterns'] as bool?, ); } Map toJson() { return { 'famous': famous, 'uid': uid, 'fid': fid, 'constraints': constraints, 'smartorb': smartorb, 'mobile': mobile, 'version': version, 'descriptions': descriptions, 'full': full, 'basic': basic, 'date1': date1?.toJson(), 'date2': date2?.toJson(), 'transitDate': transitDate?.toJson(), 'extra': extra, 'typename': typename, 'type': type, 'houseSystem': houseSystem, 'sidereal': sidereal, 'saveData': saveData, 'transitTime': transitTime, 'syn': syn, 'astroDate': astroDate?.toJson(), 'isReport': isReport, 'getPatterns': getPatterns, }; } } class LifePath { final int? numerologyID; final String? title; final String? description; final int? path; final dynamic image; final dynamic phrase; final String? type; final String? tarot; final String? tarotCategory; final String? tarotNumber; LifePath({ this.numerologyID, this.title, this.description, this.path, this.image, this.phrase, this.type, this.tarot, this.tarotCategory, this.tarotNumber, }); factory LifePath.fromJson(Map json) { return LifePath( numerologyID: json['NumerologyID'] as int?, title: json['Title'] as String?, description: json['Description'] as String?, path: json['Path'] as int?, image: json['Image'], phrase: json['Phrase'], type: json['Type'] as String?, tarot: json['Tarot'] as String?, tarotCategory: json['TarotCategory'] as String?, tarotNumber: json['TarotNumber'] as String?, ); } Map toJson() { return { 'NumerologyID': numerologyID, 'Title': title, 'Description': description, 'Path': path, 'Image': image, 'Phrase': phrase, 'Type': type, 'Tarot': tarot, 'TarotCategory': tarotCategory, 'TarotNumber': tarotNumber, }; } } class ExtendedMoonInfo { final Mooninfo? moonInfo; final String? moonString; final String? moonImage; final String? voidString; final String? oobString; final String? oOBBegins; final String? oOBEnds; final String? vOCBegins; final String? vOCEnds; final List lastAspect; final String? nextMoonDate; final String? nextLunarDate; final Degree? degree; final Nextmoon? nextMoon; final Nextlunar? nextLunar; ExtendedMoonInfo({ this.moonInfo, this.moonString, this.moonImage, this.voidString, this.oobString, this.oOBBegins, this.oOBEnds, this.vOCBegins, this.vOCEnds, this.lastAspect, this.nextMoonDate, this.nextLunarDate, this.degree, this.nextMoon, this.nextLunar, }); factory ExtendedMoonInfo.fromJson(Map json) { return ExtendedMoonInfo( moonInfo: json['moonInfo'] != null ? Mooninfo.fromJson(json['moonInfo'] as Map) : null, moonString: json['moonString'] as String?, moonImage: json['moonImage'] as String?, voidString: json['voidString'] as String?, oobString: json['oobString'] as String?, oOBBegins: json['OOBBegins'] as String?, oOBEnds: json['OOBEnds'] as String?, vOCBegins: json['VOCBegins'] as String?, vOCEnds: json['VOCEnds'] as String?, lastAspect: (json['lastAspect'] as List?)?.cast(), nextMoonDate: json['nextMoonDate'] as String?, nextLunarDate: json['nextLunarDate'] as String?, degree: json['degree'] != null ? Degree.fromJson(json['degree'] as Map) : null, nextMoon: json['nextMoon'] != null ? Nextmoon.fromJson(json['nextMoon'] as Map) : null, nextLunar: json['nextLunar'] != null ? Nextlunar.fromJson(json['nextLunar'] as Map) : null, ); } Map toJson() { return { 'moonInfo': moonInfo?.toJson(), 'moonString': moonString, 'moonImage': moonImage, 'voidString': voidString, 'oobString': oobString, 'OOBBegins': oOBBegins, 'OOBEnds': oOBEnds, 'VOCBegins': vOCBegins, 'VOCEnds': vOCEnds, 'lastAspect': lastAspect, 'nextMoonDate': nextMoonDate, 'nextLunarDate': nextLunarDate, 'degree': degree?.toJson(), 'nextMoon': nextMoon?.toJson(), 'nextLunar': nextLunar?.toJson(), }; } } class PlanetHourInfo { final List planetHours; final dynamic day; final String? night; final int? hourRulerIndex; final String? date; final String? dayRuler; final String? hourRuler; final String? sunrise; final String? sunset; final String? moonrise; final String? moonset; final String? hourRulerBegin; final String? hourRulerEnd; PlanetHourInfo({ this.planetHours, this.day, this.night, this.hourRulerIndex, this.date, this.dayRuler, this.hourRuler, this.sunrise, this.sunset, this.moonrise, this.moonset, this.hourRulerBegin, this.hourRulerEnd, }); factory PlanetHourInfo.fromJson(Map json) { return PlanetHourInfo( planetHours: (json['PlanetHours'] as List?)?.map((e) => Planethour.fromJson(e as Map)).toList(), day: json['Day'], night: json['Night'] as String?, hourRulerIndex: json['HourRulerIndex'] as int?, date: json['Date'] as String?, dayRuler: json['DayRuler'] as String?, hourRuler: json['HourRuler'] as String?, sunrise: json['Sunrise'] as String?, sunset: json['Sunset'] as String?, moonrise: json['Moonrise'] as String?, moonset: json['Moonset'] as String?, hourRulerBegin: json['HourRulerBegin'] as String?, hourRulerEnd: json['HourRulerEnd'] as String?, ); } Map toJson() { return { 'PlanetHours': planetHours?.map((e) => e.toJson()).toList(), 'Day': day, 'Night': night, 'HourRulerIndex': hourRulerIndex, 'Date': date, 'DayRuler': dayRuler, 'HourRuler': hourRuler, 'Sunrise': sunrise, 'Sunset': sunset, 'Moonrise': moonrise, 'Moonset': moonset, 'HourRulerBegin': hourRulerBegin, 'HourRulerEnd': hourRulerEnd, }; } } ============================================================ ✅ Copy the classes above into your models directory ============================================================
Test #36 (unknown) SUCCESS
Test #37 (unknown) SUCCESS
Test #38 (unknown) SUCCESS
Logs: 🔬 DIAGNOSTIC TEST: Form vs UserProfile Calculation ============================================================
Test #39 (unknown) ERROR
Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API package:sqflite_common/src/sqflite_database_factory.dart 32:7 databaseFactory. package:sqflite_common/src/sqflite_database_factory.dart 36:6 databaseFactory package:sqflite_common/sqflite.dart 109:38 getDatabasesPath package:astromatrix/core/json_storage_service.dart 26:26 JsonStorageService._initDatabase package:astromatrix/core/json_storage_service.dart 21:23 JsonStorageService.database package:astromatrix/core/json_storage_service.dart 208:24 JsonStorageService.createRecord package:astromatrix/core/preferences_service.dart 69:24 PreferenceService._upsertPreferences ===== asynchronous gap =========================== dart:async _CustomZone.registerBinaryCallback package:astromatrix/services/horoscope_service.dart 178:5 HoroscopeService.setUser1 test/birth_comparision_test.dart 183:19 main. ===== asynchronous gap =========================== dart:async _CustomZone.registerUnaryCallback test/birth_comparision_test.dart 92:25 main.
Logs: 📋 TEST BIRTH DATA Birth: September 9, 1985, 9:20 PM, Toulouse, France 1️⃣ Getting location data... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Toulouse Found 1 location suggestions for 'Toulouse' (Advanced: false) Selecting location: Toulouse, , France 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Toulouse%2C%20%2C%20France 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=495148800&lat=43.60426&lng=1.44367 Location selected successfully: Toulouse, , France Location: Toulouse, , France Lat/Lng: 43.60426, 1.44367 TimeOffset: 120 DST: true 2️⃣ BASELINE: Calculating via calculatePositionsForForm()... 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test Subject, day: 9, month: 9, year: 1985, fullDate: 9/9/1985, fullDateStr: September 9th 1985 21:20, timeHour: 9, timeMinute: 20, timePM: PM, time: 21:20, town: Toulouse, , France, selectedTown: true, lat: 43.60426, lng: 1.44367, timeOffset: 120, dst: true, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ BASELINE RESULT (CORRECT): Sun: Virgo 167.0420725240564°null' Moon: Cancer 103.14858954261324°null' Asc: Aries 18.713780957401667°null' 3️⃣ Creating user via UserService.createUser() [REAL API]... 📝 UserService.createUser() called for: Test Subject 🌐 Calling remote.createUser()... 🌐 RemoteUserBackend.createUser() called 📤 Sending payload: {uid: test_user_123, name: Test Subject, day: 9, month: 9, year: 1985, time: 21:20, town: Toulouse, , France, timeOffset: 120, lat: 43.60426, lng: 1.44367, gender: true} 🌐 POST: https://club.astromatrix.org/users/addUser 📦 Payload: {uid: test_user_123, name: Test Subject, day: 9, month: 9, year: 1985, time: 21:20, town: Toulouse, , France, timeOffset: 120, lat: 43.60426, lng: 1.44367, gender: true} 📥 Response success: true 📥 Response data type: _Map 📥 Response data: {day: 9, month: 9, year: 1985, manual: false, mainUser: false, isDeleted: false, isMigrated: false, _id: 697e97b8a2b54163009c26c5, uid: test_user_123, profileId: 697e97b8a2b54163009c26c5, name: Test Subject, time: 21:20, timezone: 120, birthLocation: Toulouse, , France, lat: 43.60426, lng: 1.44367, mainUserId: test_user_123, __v: 0} ✅ Response is already a Map 🔍 API Response keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) 🔍 Has "data" field? false 🔍 Has "profileId" field? true ✅ Creating UserProfile from apiResponse... 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) ✅ Remote create succeeded, user.id: 697e97b8a2b54163009c26c5 First user created, setting as main user... 🌐 POST: https://club.astromatrix.org/users/verifyprofile 📦 Payload: {uid: test_user_123, profileId: 697e97b8a2b54163009c26c5, verify: true} 💾 Saved to local storage ✅ User created via API: ID: 697e97b8a2b54163009c26c5 Name: Test Subject Date: 1985-9-9 Time: 21:20 Town: Toulouse, , France Lat/Lng: 43.60426, 1.44367 Timezone: 120.0 4️⃣ Retrieving user via UserService.getUserById()... 🔍 UserService.getUserById() called for: 697e97b8a2b54163009c26c5 🌐 RemoteUserBackend.getUserById() - userId: 697e97b8a2b54163009c26c5 🌐 GET: https://club.astromatrix.org/users/getUser/697e97b8a2b54163009c26c5 📥 Response success: true, data type: _Map ✅ Parsing user from response... 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (id, username, birthtown, timeunknown, uid, fid, ..., subscribed, mainUser) ✅ Found user: Test Subject 💾 Saved to local storage ✅ User retrieved: Date: 1985-9-9 Time: 21:20 Town: Toulouse, , France Lat/Lng: 43.60426, 1.44367 Timezone: 120.0 5️⃣ Calculating via calculatePositions() with RETRIEVED user... 📝 Setting preference chart_service_user1_id: 697e97b8a2b54163009c26c5 ⚠️ Error upserting preferences: Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API ⚠️ Error setting preference chart_service_user1_id: Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /chartview, date1: ChartDate(name: Test Subject, day: 9, month: 9, year: 1985, fullDate: 9/9/1985, fullDateStr: September 9th 1985 21:20, timeHour: 9, timeMinute: 20, timePM: PM, time: 21:20, town: Toulouse, , France, selectedTown: null, lat: 43.60426, lng: 1.44367, timeOffset: 120, dst: null, noTime: false, bio: null, mainUser: true, type: Birth), date2: ChartDate(name: null, day: null, month: null, year: null, fullDate: undefined/undefined/undefined, fullDateStr: undefined undefinedth undefined undefined, timeHour: null, timeMinute: null, timePM: null, time: null, town: null, selectedTown: null, lat: null, lng: null, timeOffset: null, dst: null, noTime: null, bio: null, mainUser: null, type: null), transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: test_user_123, fid: 697e97b8a2b54163009c26c5, progressedDate: null} 📊 RETRIEVED USER RESULT: Sun: Virgo 167.0420725240564°null' Moon: Cancer 103.14858954261324°null' Asc: Aries 18.713780957401667°null' 6️⃣ COMPARISON RESULTS: ====================================================================== 🔍 DATA INTEGRITY CHECK: Created vs Retrieved: ✅ MATCH ☀️ Sun Match: ✅ SAME 🌙 Moon Match: ✅ SAME ⬆️ Ascendant Match: ✅ SAME ====================================================================== ✅ FULL WORKFLOW SUCCESS! Form → UserService.createUser → getUserById → calculatePositions All positions match! The bug is NOT in this workflow. The issue must be: 1. How users are loaded in the real app (getUsers vs getUserById) 2. Caching somewhere in the UI layer 3. User2 being set unexpectedly 🗑️ UserService.deleteUser() called for: 697e97b8a2b54163009c26c5 💾 Deleted from local storage 🌐 RemoteUserBackend.deleteUser() - profileId: 697e97b8a2b54163009c26c5, userId: test_user_123 🧹 Cleaned up test user 🌐 POST: https://club.astromatrix.org/users/erase 📦 Payload: {uid: test_user_123, profileId: 697e97b8a2b54163009c26c5}
Test #40 (unknown) SUCCESS
Test #41 (unknown) ERROR
Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API package:sqflite_common/src/sqflite_database_factory.dart 32:7 databaseFactory. package:sqflite_common/src/sqflite_database_factory.dart 36:6 databaseFactory package:sqflite_common/sqflite.dart 109:38 getDatabasesPath package:astromatrix/core/json_storage_service.dart 26:26 JsonStorageService._initDatabase package:astromatrix/core/json_storage_service.dart 21:23 JsonStorageService.database package:astromatrix/core/json_storage_service.dart 208:24 JsonStorageService.createRecord package:astromatrix/core/preferences_service.dart 69:24 PreferenceService._upsertPreferences
Logs: 📋 TEST DATA Birth: September 9, 1985, 9:20 PM, Toulouse, France 1️⃣ Getting location... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Toulouse Found 1 location suggestions for 'Toulouse' (Advanced: false) Selecting location: Toulouse, , France 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Toulouse%2C%20%2C%20France 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=495148800&lat=43.60426&lng=1.44367 Location selected successfully: Toulouse, , France Location: Toulouse, , France Lat/Lng: 43.60426, 1.44367 TimeOffset: 120 DST: true 2️⃣ Calculating via calculatePositionsForForm() [CORRECT METHOD]... 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test Subject, day: 9, month: 9, year: 1985, fullDate: 9/9/1985, fullDateStr: September 9th 1985 21:20, timeHour: 9, timeMinute: 20, timePM: PM, time: 21:20, town: Toulouse, , France, selectedTown: true, lat: 43.60426, lng: 1.44367, timeOffset: 120, dst: true, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ FORM RESULT (CORRECT): Sun: Virgo 167.0420725240564°null' Moon: Cancer 103.14858954261324°null' Asc: Aries 18.713780957401667°null' 3️⃣ Creating UserProfile with identical data... UserProfile created: Name: Test Subject Date: 1985-9-9 Time: 21:20 Town: Toulouse, , France Lat/Lng: 43.60426, 1.44367 Timezone: 120.0 4️⃣ Calculating via calculatePositions() [WRONG METHOD]... 📝 Setting preference chart_service_user1_id: test_chart_id ⚠️ Error upserting preferences: Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API ⚠️ Error setting preference chart_service_user1_id: Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API
Test #42 (unknown) SUCCESS
Test #43 (unknown) SUCCESS
Test #44 (unknown) SUCCESS
Logs: 🚀 Starting TarotService Integration Tests...
Test #45 (unknown) SUCCESS
Logs: 🃏 Testing tarot title conversion... ✅ Title conversion works correctly
Test #46 (unknown) SUCCESS
Logs: 🃏 Testing 3 Card spread... ✅ 3 Card layout: 1, 2, 3
Test #47 (unknown) SUCCESS
Logs: 🃏 Testing 6 Card spread... ✅ 6 Card layout generated
Test #48 (unknown) SUCCESS
Logs: 🃏 Testing 5 Card Diamond spread... ✅ 5 Card Diamond layout (3x3 grid)
Test #49 (unknown) SUCCESS
Logs: 🃏 Testing 5 Card Cross spread... ✅ 5 Card Cross layout generated
Test #50 (unknown) SUCCESS
Logs: 🃏 Testing unknown spread fallback... ✅ Unknown spread defaults to 3 Card
Test #51 (unknown) FAILURE
Expected: non-empty Actual: [] Should fetch spreads from API package:matcher expect package:flutter_test/src/widget_tester.dart 473:18 expect test/tarot_service_test.dart 101:7 main..
Logs: 🃏 Testing tarot spreads API... 🌐 GET: https://club.astromatrix.org/tarot/getTarotSpreads Warning: At least one test in this suite creates an HttpClient. When running a test suite that uses TestWidgetsFlutterBinding, all HTTP requests will return status code 400, and no network request will actually be made. Any test expecting a real network connection and status code will fail. To test code that needs an HttpClient, provide your own HttpClient implementation to the code under test, so that your test can consistently provide a testable response to the code under test.
Test #52 (unknown) FAILURE
Expected: non-empty Actual: [] package:matcher expect package:flutter_test/src/widget_tester.dart 473:18 expect test/tarot_service_test.dart 122:7 main..
Logs: 🃏 Testing spread caching... 🌐 GET: https://club.astromatrix.org/tarot/getTarotSpreads
Test #53 (unknown) FAILURE
Expected: non-empty Actual: [] package:matcher expect package:flutter_test/src/widget_tester.dart 473:18 expect test/tarot_service_test.dart 139:7 main..
Logs: 🃏 Testing force refresh... 🌐 GET: https://club.astromatrix.org/tarot/getTarotSpreads 🌐 GET: https://club.astromatrix.org/tarot/getTarotSpreads
Test #54 (unknown) SUCCESS
Logs: 🃏 Testing Wands suit... ✅ Wands suit: 14 cards
Test #55 (unknown) SUCCESS
Logs: 🃏 Testing Pentacles suit... ✅ Pentacles suit: 14 cards
Test #56 (unknown) SUCCESS
Logs: 🃏 Testing Cups suit... ✅ Cups suit: 14 cards
Test #57 (unknown) SUCCESS
Logs: 🃏 Testing Swords suit... ✅ Swords suit: 14 cards
Test #58 (unknown) SUCCESS
Logs: 🃏 Testing Major Arcana... ✅ Major Arcana: 22 cards
Test #59 (unknown) SUCCESS
Logs: 🃏 Testing invalid section... ✅ Invalid section handled correctly
Test #60 (unknown) SUCCESS
Logs: 🃏 Testing title conversion in lists... ✅ Titles converted in lists
Test #61 (unknown) SUCCESS
Logs: 🃏 Testing major arcana codes... ✅ All major arcana codes present (A00-A21)
Test #62 (unknown) SUCCESS
Logs: 🃏 Testing suit codes... ✅ All suit codes present (A23-A78)
Test #63 (unknown) SUCCESS
Logs: ✅ All TarotService tests completed!
Test #64 (unknown) SUCCESS
Test #65 (unknown) SUCCESS
Logs: ✅ Storage initialized
Test #66 (unknown) SUCCESS
Logs: 🔥 Testing Chart Calculation... ⚠️ Cannot save preference chart_service_user1_id: No user logged in 📖 No value for houseSystem and no user logged in 📖 No value for timeSystem and no user logged in 📖 No value for orb and no user logged in 📖 No value for relationshipOrb and no user logged in 📖 No value for horoscopeOrb and no user logged in 📖 No value for isSmart and no user logged in 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /chartview, date1: ChartDate(name: bbb, day: 4, month: 1, year: 2000, fullDate: 4/1/2000, fullDateStr: January 4th 2000 22:00, timeHour: 10, timeMinute: 00, timePM: PM, time: 22:00, town: Sydney, New South Wales, Australia, selectedTown: null, lat: -33.86785, lng: 151.20732, timeOffset: 660, dst: null, noTime: false, bio: null, mainUser: true, type: Birth), date2: ChartDate(name: null, day: null, month: null, year: null, fullDate: undefined/undefined/undefined, fullDateStr: undefined undefinedth undefined undefined, timeHour: null, timeMinute: null, timePM: null, time: null, town: null, selectedTown: null, lat: null, lng: null, timeOffset: null, dst: null, noTime: null, bio: null, mainUser: null, type: null), transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: test, fid: test, progressedDate: null} 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in Success: true ✅ Chart calculated! Data keys: (planets, transitPlanets, houses, transitHouses, ..., topComponents, JSON) 🔍 Checking data contents: planets count: 27 houses count: 12 aspects count: 0 First planet: {house: 5, transitHouse: 0, sign: Capricorn, planet: Sun, degree: 283.3850810133457, declination: -22.764468270010916, distance: 147105345.1686441, apoperigee: 0.0, relativeDegree: 13.39, quote: null, quoteAuthor: null, retrograde: false, element: null, phrase: null, sabian: null, traits: [], principles: [], relationshipTypes: [], JSON: null, houseJSON: null, transitHouseBegins: 0001-01-01T00:00:00, transitHouseEnds: 0001-01-01T00:00:00, duration: 0, tarot: null, extra: null, signDescription: , houseDescription: } ✅ DATA IS REAL - API ACCEPTED THE PAYLOAD! ✅ Test completed!
Test #67 (unknown) SUCCESS
Test #68 (unknown) SUCCESS
Test #69 (unknown) SUCCESS
Logs: ✅ Storage initialized
Test #70 (unknown) SUCCESS
Test #71 (unknown) SUCCESS
Logs: 🚀 Starting API Integration Tests...
Test #72 (unknown) SUCCESS
Logs: 🔍 Testing location search for "New York"... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=New%20York Found 19 location suggestions for 'New York' (Advanced: false) ✅ Found 19 locations First result: New York City, New York, United States
Test #73 (unknown) SUCCESS
Logs: 🔍 Testing location search for "London"... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=London Found 11 location suggestions for 'London' (Advanced: false) ✅ Found 11 locations First result: London, England, United Kingdom
Test #74 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in 🧪 Single Request Test 🌐 [self] Starting API call ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in ✓ API calls: 1 (expected: 1) ✓ From cache: false (expected: false)
Test #75 (unknown) SUCCESS
Test #76 (unknown) SUCCESS
Logs: 🧪 HOROSCOPE SERVICE calculatePositions() TEST ================================================================================
Test #77 (unknown) SUCCESS
Logs: 🌍 Testing timezone lookup... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Paris Found 12 location suggestions for 'Paris' (Advanced: false) Selecting location: Paris, , France 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Paris%2C%20%2C%20France 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=632413800&lat=48.85341&lng=2.3488 Location selected successfully: Paris, , France ✅ Location: Paris, , France Timezone: Europe/Paris Coordinates: 48.85341, 2.3488 Offset: 60 minutes
Test #78 (unknown) SUCCESS
Logs: 🔍 Testing empty query... ✅ Empty query handled correctly
Test #79 (unknown) SUCCESS
Logs: 🔍 Testing short query... ✅ Short query handled correctly
Test #80 (unknown) SUCCESS
Logs: 🌟 Testing birth chart calculation... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Tokyo Found 1 location suggestions for 'Tokyo' (Advanced: false) Selecting location: Tokyo, Tokyo-to, Japan 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Tokyo%2C%20Tokyo-to%2C%20Japan 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=645460200&lat=35.6895&lng=139.69171 Location selected successfully: Tokyo, Tokyo-to, Japan 📖 No value for houseSystem and no user logged in 📖 No value for timeSystem and no user logged in 📖 No value for orb and no user logged in 📖 No value for relationshipOrb and no user logged in 📖 No value for horoscopeOrb and no user logged in 📖 No value for isSmart and no user logged in 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test Person, day: 15, month: 6, year: 1990, fullDate: 15/6/1990, fullDateStr: June 15th 1990 14:30, timeHour: 2, timeMinute: 30, timePM: PM, time: 14:30, town: Tokyo, Tokyo-to, Japan, selectedTown: true, lat: 35.6895, lng: 139.69171, timeOffset: 540, dst: false, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ Chart calculated successfully Sun: 23°52' Gemini Moon: 11°45' Pisces Ascendant: 29°18' Libra
Test #81 (unknown) ERROR
Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API package:sqflite_common/src/sqflite_database_factory.dart 32:7 databaseFactory. package:sqflite_common/src/sqflite_database_factory.dart 36:6 databaseFactory package:sqflite_common/sqflite.dart 109:38 getDatabasesPath package:astromatrix/core/json_storage_service.dart 26:26 JsonStorageService._initDatabase package:astromatrix/core/json_storage_service.dart 21:23 JsonStorageService.database package:astromatrix/core/json_storage_service.dart 208:24 JsonStorageService.createRecord package:astromatrix/core/preferences_service.dart 69:24 PreferenceService._upsertPreferences ===== asynchronous gap =========================== dart:async _CustomZone.registerBinaryCallback package:astromatrix/services/horoscope_service.dart 178:5 HoroscopeService.setUser1 test/horoscope_service_test.dart 166:18 main. ===== asynchronous gap =========================== dart:async _CustomZone.registerUnaryCallback test/horoscope_service_test.dart 132:25 main.
type '() => Map' is not a subtype of type '(() => Map)?' of 'orElse' dart:collection ListBase.firstWhere test/horoscope_service_test.dart 185:25 main.
Logs: 📋 TEST 1: Birth Chart via calculatePositions() Birth: Sept 9, 1985, 9:20 PM, Toulouse, France 1️⃣ Creating user via UserService... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Toulouse Found 1 location suggestions for 'Toulouse' (Advanced: false) Selecting location: Toulouse, , France 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Toulouse%2C%20%2C%20France 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=495148800&lat=43.60426&lng=1.44367 Location selected successfully: Toulouse, , France 📝 UserService.createUser() called for: Agata 🌐 Calling remote.createUser()... 🌐 RemoteUserBackend.createUser() called 📤 Sending payload: {uid: test_user_123, name: Agata, day: 9, month: 9, year: 1985, time: 21:20, town: Toulouse, , France, timeOffset: 120, lat: 43.60426, lng: 1.44367, gender: true} 🌐 POST: https://club.astromatrix.org/users/addUser 📦 Payload: {uid: test_user_123, name: Agata, day: 9, month: 9, year: 1985, time: 21:20, town: Toulouse, , France, timeOffset: 120, lat: 43.60426, lng: 1.44367, gender: true} 📥 Response success: true 📥 Response data type: _Map 📥 Response data: {day: 9, month: 9, year: 1985, manual: false, mainUser: false, isDeleted: false, isMigrated: false, _id: 697e97bda2b54163009c26d9, uid: test_user_123, profileId: 697e97bda2b54163009c26d9, name: Agata, time: 21:20, timezone: 120, birthLocation: Toulouse, , France, lat: 43.60426, lng: 1.44367, mainUserId: test_user_123, __v: 0} ✅ Response is already a Map 🔍 API Response keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) 🔍 Has "data" field? false 🔍 Has "profileId" field? true ✅ Creating UserProfile from apiResponse... 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) ✅ Remote create succeeded, user.id: 697e97bda2b54163009c26d9 First user created, setting as main user... 🌐 POST: https://club.astromatrix.org/users/verifyprofile 📦 Payload: {uid: test_user_123, profileId: 697e97bda2b54163009c26d9, verify: true} 💾 Saved to local storage ✅ User: Agata Birth: 1985-9-9 21:20 Location: 43.60426, 1.44367 Timezone: 120.0 2️⃣ Setting up HoroscopeService... 📝 Setting preference chart_service_user1_id: 697e97bda2b54163009c26d9 3️⃣ Calling calculatePositions(chartType: birth, useCache: false)... ⚠️ Error upserting preferences: Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API ⚠️ Error setting preference chart_service_user1_id: Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /chartview, date1: ChartDate(name: Agata, day: 9, month: 9, year: 1985, fullDate: 9/9/1985, fullDateStr: September 9th 1985 21:20, timeHour: 9, timeMinute: 20, timePM: PM, time: 21:20, town: Toulouse, , France, selectedTown: null, lat: 43.60426, lng: 1.44367, timeOffset: 120, dst: null, noTime: false, bio: null, mainUser: true, type: Birth), date2: ChartDate(name: null, day: null, month: null, year: null, fullDate: undefined/undefined/undefined, fullDateStr: undefined undefinedth undefined undefined, timeHour: null, timeMinute: null, timePM: null, time: null, town: null, selectedTown: null, lat: null, lng: null, timeOffset: null, dst: null, noTime: null, bio: null, mainUser: null, type: null), transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:01, timeHour: null, timeMinute: null, timePM: null, time: 0:01, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: test_user_123, fid: 697e97bda2b54163009c26d9, progressedDate: null} 📥 API Response: Sun: Virgo 167.04° (house 6) Moon: Cancer 103.15° (house 4) Asc: Aries 18.71° 4️⃣ Verifying result...
Test #82 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in 🧪 2 Simultaneous Requests (CRITICAL TEST) 🌐 [self] Starting API call ⏳ [self] Reusing in-flight request (late arrival) ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in ✓ API calls: 1 (expected: 1) ✅ ✓ Both succeeded: true
Test #83 (unknown) ERROR
Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API package:sqflite_common/src/sqflite_database_factory.dart 32:7 databaseFactory. package:sqflite_common/src/sqflite_database_factory.dart 36:6 databaseFactory package:sqflite_common/sqflite.dart 109:38 getDatabasesPath package:astromatrix/core/json_storage_service.dart 26:26 JsonStorageService._initDatabase package:astromatrix/core/json_storage_service.dart 21:23 JsonStorageService.database package:astromatrix/core/json_storage_service.dart 208:24 JsonStorageService.createRecord package:astromatrix/core/preferences_service.dart 69:24 PreferenceService._upsertPreferences ===== asynchronous gap =========================== dart:async _CustomZone.registerBinaryCallback package:astromatrix/services/horoscope_service.dart 178:5 HoroscopeService.setUser1 test/horoscope_service_test.dart 264:19 main. ===== asynchronous gap =========================== dart:async _CustomZone.registerUnaryCallback test/horoscope_service_test.dart 218:25 main.
Logs: 📋 TEST 2: Consistency Check Same birth data through two different code paths 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Toulouse Found 1 location suggestions for 'Toulouse' (Advanced: false) Selecting location: Toulouse, , France 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Toulouse%2C%20%2C%20France 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=495148800&lat=43.60426&lng=1.44367 Location selected successfully: Toulouse, , France 1️⃣ Method 1: calculatePositionsForForm() [BASELINE] 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Agata, day: 9, month: 9, year: 1985, fullDate: 9/9/1985, fullDateStr: September 9th 1985 21:20, timeHour: 9, timeMinute: 20, timePM: PM, time: 21:20, town: Toulouse, , France, selectedTown: true, lat: 43.60426, lng: 1.44367, timeOffset: 120, dst: true, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:01, timeHour: null, timeMinute: null, timePM: null, time: 0:01, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} 📥 API Response: Sun: Virgo 167.04° (house 6) Moon: Cancer 103.15° (house 4) Asc: Aries 18.71° ✅ Baseline calculated 2️⃣ Method 2: UserService.createUser() + calculatePositions() 📝 UserService.createUser() called for: Agata 🌐 Calling remote.createUser()... 🌐 RemoteUserBackend.createUser() called 📤 Sending payload: {uid: test_user_123, name: Agata, day: 9, month: 9, year: 1985, time: 21:20, town: Toulouse, , France, timeOffset: 120, lat: 43.60426, lng: 1.44367, gender: true} 🌐 POST: https://club.astromatrix.org/users/addUser 📦 Payload: {uid: test_user_123, name: Agata, day: 9, month: 9, year: 1985, time: 21:20, town: Toulouse, , France, timeOffset: 120, lat: 43.60426, lng: 1.44367, gender: true} 📥 Response success: true 📥 Response data type: _Map 📥 Response data: {day: 9, month: 9, year: 1985, manual: false, mainUser: false, isDeleted: false, isMigrated: false, _id: 697e97bea2b54163009c26dd, uid: test_user_123, profileId: 697e97bea2b54163009c26dd, name: Agata, time: 21:20, timezone: 120, birthLocation: Toulouse, , France, lat: 43.60426, lng: 1.44367, mainUserId: test_user_123, __v: 0} ✅ Response is already a Map 🔍 API Response keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) 🔍 Has "data" field? false 🔍 Has "profileId" field? true ✅ Creating UserProfile from apiResponse... 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) ✅ Remote create succeeded, user.id: 697e97bea2b54163009c26dd First user created, setting as main user... 🌐 POST: https://club.astromatrix.org/users/verifyprofile 📦 Payload: {uid: test_user_123, profileId: 697e97bea2b54163009c26dd, verify: true} 💾 Saved to local storage 📝 Setting preference chart_service_user1_id: 697e97bea2b54163009c26dd ⚠️ Error upserting preferences: Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API ⚠️ Error setting preference chart_service_user1_id: Bad state: databaseFactory not initialized databaseFactory is only initialized when using sqflite. When using `sqflite_common_ffi` You must call `databaseFactory = databaseFactoryFfi;` before using global openDatabase API 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /chartview, date1: ChartDate(name: Agata, day: 9, month: 9, year: 1985, fullDate: 9/9/1985, fullDateStr: September 9th 1985 21:20, timeHour: 9, timeMinute: 20, timePM: PM, time: 21:20, town: Toulouse, , France, selectedTown: null, lat: 43.60426, lng: 1.44367, timeOffset: 120, dst: null, noTime: false, bio: null, mainUser: true, type: Birth), date2: ChartDate(name: null, day: null, month: null, year: null, fullDate: undefined/undefined/undefined, fullDateStr: undefined undefinedth undefined undefined, timeHour: null, timeMinute: null, timePM: null, time: null, town: null, selectedTown: null, lat: null, lng: null, timeOffset: null, dst: null, noTime: null, bio: null, mainUser: null, type: null), transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:01, timeHour: null, timeMinute: null, timePM: null, time: 0:01, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: test_user_123, fid: 697e97bea2b54163009c26dd, progressedDate: null} 📥 API Response: Sun: Virgo 167.04° (house 6) Moon: Cancer 103.15° (house 4) Asc: Aries 18.71° ✅ User method calculated 3️⃣ Comparing responses... ✅ Responses are IDENTICAL ================================================================================ ✅ CONSISTENCY VERIFIED Both methods produce identical results! Bug is NOT in payload construction or API calls ================================================================================ 🗑️ UserService.deleteUser() called for: 697e97bea2b54163009c26dd 💾 Deleted from local storage 🌐 RemoteUserBackend.deleteUser() - profileId: 697e97bea2b54163009c26dd, userId: test_user_123 🧹 Cleaned up test user 🌐 POST: https://club.astromatrix.org/users/erase 📦 Payload: {uid: test_user_123, profileId: 697e97bea2b54163009c26dd}
Test #84 (unknown) SUCCESS
Test #85 (unknown) SUCCESS
Test #86 (unknown) SUCCESS
Logs: ✅ Storage initialized
Test #87 (unknown) SUCCESS
Logs: 🌟 Testing multiple locations... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Berlin Found 14 location suggestions for 'Berlin' (Advanced: false) Selecting location: Berlin, Land Berlin, Germany 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Berlin%2C%20Land%20Berlin%2C%20Germany 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=795689100&lat=52.52437&lng=13.41053 Location selected successfully: Berlin, Land Berlin, Germany 📖 No value for houseSystem and no user logged in 📖 No value for timeSystem and no user logged in 📖 No value for orb and no user logged in 📖 No value for relationshipOrb and no user logged in 📖 No value for horoscopeOrb and no user logged in 📖 No value for isSmart and no user logged in 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test, day: 20, month: 3, year: 1995, fullDate: 20/3/1995, fullDateStr: March 20th 1995 8:45, timeHour: 8, timeMinute: 45, timePM: AM, time: 8:45, town: Berlin, Land Berlin, Germany, selectedTown: true, lat: 52.52437, lng: 13.41053, timeOffset: 60, dst: false, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ Berlin: Pisces Sun 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Sydney Found 3 location suggestions for 'Sydney' (Advanced: false) Selecting location: Sydney, New South Wales, Australia 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Sydney%2C%20New%20South%20Wales%2C%20Australia 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=795689100&lat=-33.86785&lng=151.20732 Location selected successfully: Sydney, New South Wales, Australia 📖 No value for houseSystem and no user logged in 📖 No value for timeSystem and no user logged in 📖 No value for orb and no user logged in 📖 No value for relationshipOrb and no user logged in 📖 No value for horoscopeOrb and no user logged in 📖 No value for isSmart and no user logged in 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test, day: 20, month: 3, year: 1995, fullDate: 20/3/1995, fullDateStr: March 20th 1995 8:45, timeHour: 8, timeMinute: 45, timePM: AM, time: 8:45, town: Sydney, New South Wales, Australia, selectedTown: true, lat: -33.86785, lng: 151.20732, timeOffset: 600, dst: false, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ Sydney: Pisces Sun 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Mumbai Found 1 location suggestions for 'Mumbai' (Advanced: false) Selecting location: Mumbai, State of Maharashtra, India 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Mumbai%2C%20State%20of%20Maharashtra%2C%20India 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=795689100&lat=19.07283&lng=72.88261 Location selected successfully: Mumbai, State of Maharashtra, India 📖 No value for houseSystem and no user logged in 📖 No value for timeSystem and no user logged in 📖 No value for orb and no user logged in 📖 No value for relationshipOrb and no user logged in 📖 No value for horoscopeOrb and no user logged in 📖 No value for isSmart and no user logged in 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test, day: 20, month: 3, year: 1995, fullDate: 20/3/1995, fullDateStr: March 20th 1995 8:45, timeHour: 8, timeMinute: 45, timePM: AM, time: 8:45, town: Mumbai, State of Maharashtra, India, selectedTown: true, lat: 19.07283, lng: 72.88261, timeOffset: 330, dst: false, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ Mumbai: Pisces Sun
Test #88 (unknown) SUCCESS
Logs: 🚀 Testing complete user flow... Step 1: Searching locations... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Rome Found 17 location suggestions for 'Rome' (Advanced: false) ✅ Found locations Step 2: Getting timezone... Selecting location: Rome, Latium, Italy 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Rome%2C%20Latium%2C%20Italy 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=599076000&lat=41.89193&lng=12.51133 Location selected successfully: Rome, Latium, Italy ✅ Timezone: Europe/Rome Step 3: Calculating chart... 📖 No value for houseSystem and no user logged in 📖 No value for timeSystem and no user logged in 📖 No value for orb and no user logged in 📖 No value for relationshipOrb and no user logged in 📖 No value for horoscopeOrb and no user logged in 📖 No value for isSmart and no user logged in 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Integration Test, day: 25, month: 12, year: 1988, fullDate: 25/12/1988, fullDateStr: December 25th 1988 18:00, timeHour: 6, timeMinute: 00, timePM: PM, time: 18:00, town: Rome, Latium, Italy, selectedTown: true, lat: 41.89193, lng: 12.51133, timeOffset: 60, dst: false, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:00, timeHour: null, timeMinute: null, timePM: null, time: 0:00, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ Chart calculated 🎉 Complete flow successful!
Test #89 (unknown) SUCCESS
Logs: 🧪 Testing invalid city... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=ZZZInvalidCity999 Found 0 location suggestions for 'ZZZInvalidCity999' (Advanced: false) ✅ Invalid city handled gracefully (0 results)
Test #90 (unknown) SUCCESS
Logs: 🧪 Testing form validation... ✅ Empty name validation works
Test #91 (unknown) SUCCESS
Logs: 🧪 Testing invalid date... ✅ Date validation works
Test #92 (unknown) SUCCESS
Logs: 🧪 Testing invalid time... ✅ Time validation works
Test #93 (unknown) SUCCESS
Logs: ✅ All tests completed!
Test #94 (unknown) SUCCESS
Test #95 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in 🧪 5 Simultaneous Requests (Stress Test) 🌐 [self] Starting API call ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in ✓ API calls: 1 (expected: 1) ✅ ✓ All succeeded: true
Test #96 (unknown) SUCCESS
Logs: 🚀 Starting User Service Tests...
Test #97 (unknown) SUCCESS
Logs: 👤 Testing user creation... 📝 UserService.createUser() called for: Mark 🌐 Calling remote.createUser()... 🌐 RemoteUserBackend.createUser() called 📤 Sending payload: {uid: test_user_123, name: Mark, day: 15, month: 6, year: 1990, time: 12:00, town: London, timeOffset: 0, lat: 51.5, lng: -0.1, gender: true} 🌐 POST: https://club.astromatrix.org/users/addUser 📦 Payload: {uid: test_user_123, name: Mark, day: 15, month: 6, year: 1990, time: 12:00, town: London, timeOffset: 0, lat: 51.5, lng: -0.1, gender: true} 📥 Response success: true 📥 Response data type: _Map 📥 Response data: {day: 15, month: 6, year: 1990, manual: false, mainUser: false, isDeleted: false, isMigrated: false, _id: 697e97c1444b00a69cbd65f5, uid: test_user_123, profileId: 697e97c1444b00a69cbd65f5, name: Mark, time: 12:00, timezone: 0, birthLocation: London, lat: 51.5, lng: -0.1, mainUserId: test_user_123, __v: 0} ✅ Response is already a Map 🔍 API Response keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) 🔍 Has "data" field? false 🔍 Has "profileId" field? true ✅ Creating UserProfile from apiResponse... 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) ✅ Remote create succeeded, user.id: 697e97c1444b00a69cbd65f5 First user created, setting as main user... 🌐 POST: https://club.astromatrix.org/users/verifyprofile 📦 Payload: {uid: test_user_123, profileId: 697e97c1444b00a69cbd65f5, verify: true} 💾 Saved to local storage ✅ User created: Mark (697e97c1444b00a69cbd65f5)
Test #98 (unknown) SUCCESS
Logs: 🔥 Comparing timezonedb and Google API... 📍 Testing: London Expected zone: Europe/London 1️⃣ Testing with timezonedb... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=London Found 11 location suggestions for 'London' (Advanced: false) Selecting location: London, England, United Kingdom 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=London%2C%20England%2C%20United%20Kingdom 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=632413800&lat=51.50853&lng=-0.12574 Location selected successfully: London, England, United Kingdom ✅ Zone: Europe/London Offset: 0 minutes DST: false 2️⃣ Testing with Google API... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=London Found 11 location suggestions for 'London' (Advanced: false) Selecting location: London, England, United Kingdom 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=London%2C%20England%2C%20United%20Kingdom 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=632413800&lat=51.50853&lng=-0.12574 Location selected successfully: London, England, United Kingdom ✅ Zone: Europe/London Offset: 0 minutes DST: false 📊 Comparison: ✅ Timezones match expected region ✅ Offsets match (diff: 0.00 min) ✅ DST flags match (false) 🎉 London test passed! ──────────────────────────────────────────────────────────── 📍 Testing: New York Expected zone: America/New_York 1️⃣ Testing with timezonedb... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=New%20York Found 19 location suggestions for 'New York' (Advanced: false) Selecting location: New York City, New York, United States 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=New%20York%20City%2C%20New%20York%2C%20United%20States 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=632413800&lat=40.71427&lng=-74.00597 Location selected successfully: New York City, New York, United States ✅ Zone: America/New_York Offset: -300 minutes DST: false 2️⃣ Testing with Google API... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=New%20York Found 19 location suggestions for 'New York' (Advanced: false) Selecting location: New York City, New York, United States 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=New%20York%20City%2C%20New%20York%2C%20United%20States 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=632413800&lat=40.71427&lng=-74.00597 Location selected successfully: New York City, New York, United States ✅ Zone: America/New_York Offset: -300 minutes DST: false 📊 Comparison: ✅ Timezones match expected region ✅ Offsets match (diff: 0.00 min) ✅ DST flags match (false) 🎉 New York test passed! ──────────────────────────────────────────────────────────── 📍 Testing: Tokyo Expected zone: Asia/Tokyo 1️⃣ Testing with timezonedb... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Tokyo Found 1 location suggestions for 'Tokyo' (Advanced: false) Selecting location: Tokyo, Tokyo-to, Japan 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Tokyo%2C%20Tokyo-to%2C%20Japan 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=632413800&lat=35.6895&lng=139.69171 Location selected successfully: Tokyo, Tokyo-to, Japan ✅ Zone: Asia/Tokyo Offset: 540 minutes DST: false 2️⃣ Testing with Google API... 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Tokyo Found 1 location suggestions for 'Tokyo' (Advanced: false) Selecting location: Tokyo, Tokyo-to, Japan 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Tokyo%2C%20Tokyo-to%2C%20Japan 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=632413800&lat=35.6895&lng=139.69171 Location selected successfully: Tokyo, Tokyo-to, Japan ✅ Zone: Asia/Tokyo Offset: 540 minutes DST: false 📊 Comparison: ✅ Timezones match expected region ✅ Offsets match (diff: 0.00 min) ✅ DST flags match (false) 🎉 Tokyo test passed! ──────────────────────────────────────────────────────────── 🎉 All locations tested successfully! Both APIs return consistent timezone data.
Test #99 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in 🧪 Cache Hit Test 🌐 [self] Starting API call ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in ✓ API calls after 2nd request: 1 (expected: 1) ✓ Second from cache: true (expected: true)
Test #100 (unknown) SUCCESS
Logs: 🔬 Validating API response formats... 1️⃣ Testing timezonedb response format... 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=1769904066&lat=51.5074&lng=-0.1278 ✅ timezonedb format valid Fields: status, message, countryCode, countryName, regionName, cityName, zoneName, abbreviation, gmtOffset, dst, zoneStart, zoneEnd, nextAbbreviation, timestamp, formatted 2️⃣ Testing Google API response format... 🌐 GET: https://maps.googleapis.com/maps/api/timezone/json?location=51.5074,-0.1278×tamp=1769904066&key=AIzaSyBY4ewruK9OQMrRlvtwa240J568btru6Yg ✅ Google API format valid Fields: dstOffset, rawOffset, status, timeZoneId, timeZoneName 🎉 Both API response formats validated!
Test #101 (unknown) SUCCESS
Test #102 (unknown) SUCCESS
Logs: ✏️ Testing user update... 📝 UserService.createUser() called for: Temp 🌐 Calling remote.createUser()... 🌐 RemoteUserBackend.createUser() called 📤 Sending payload: {uid: test_user_123, name: Temp, day: 1, month: 1, year: 1991, time: 10:00, town: Paris, timeOffset: 60, lat: 48.8, lng: 2.3, gender: true} 🌐 POST: https://club.astromatrix.org/users/addUser 📦 Payload: {uid: test_user_123, name: Temp, day: 1, month: 1, year: 1991, time: 10:00, town: Paris, timeOffset: 60, lat: 48.8, lng: 2.3, gender: true} 📥 Response success: true 📥 Response data type: _Map 📥 Response data: {day: 1, month: 1, year: 1991, manual: false, mainUser: false, isDeleted: false, isMigrated: false, _id: 697e97c1247b5b7e8c03689d, uid: test_user_123, profileId: 697e97c1247b5b7e8c03689d, name: Temp, time: 10:00, timezone: 60, birthLocation: Paris, lat: 48.8, lng: 2.3, mainUserId: test_user_123, __v: 0} ✅ Response is already a Map 🔍 API Response keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) 🔍 Has "data" field? false 🔍 Has "profileId" field? true ✅ Creating UserProfile from apiResponse... 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) ✅ Remote create succeeded, user.id: 697e97c1247b5b7e8c03689d First user created, setting as main user... 🌐 POST: https://club.astromatrix.org/users/verifyprofile 📦 Payload: {uid: test_user_123, profileId: 697e97c1247b5b7e8c03689d, verify: true} 💾 Saved to local storage ✏️ UserService.updateUser() called for: 697e97c1247b5b7e8c03689d 🌐 Calling remote.updateUser()... 🌐 PUT: https://club.astromatrix.org/users/edit/697e97c1247b5b7e8c03689d 📦 Payload: {name: Updated, day: 1, month: 5, year: 1980, time: 11:11, town: Paris, birthLocation: Paris, timezone: 60, lat: 48.8, lng: 2.3, gender: true} 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) ✅ Remote update succeeded 💾 Updated local storage ✅ User updated: Updated
Test #103 (unknown) SUCCESS
Logs: 🗑️ Testing user deletion... 📝 UserService.createUser() called for: ToDelete 🌐 Calling remote.createUser()... 🌐 RemoteUserBackend.createUser() called 📤 Sending payload: {uid: test_user_123, name: ToDelete, day: 1, month: 1, year: 2000, time: 00:00, town: Test City, timeOffset: 0, lat: 0.0, lng: 0.0, gender: true} 🌐 POST: https://club.astromatrix.org/users/addUser 📦 Payload: {uid: test_user_123, name: ToDelete, day: 1, month: 1, year: 2000, time: 00:00, town: Test City, timeOffset: 0, lat: 0.0, lng: 0.0, gender: true} 📥 Response success: true 📥 Response data type: _Map 📥 Response data: {day: 1, month: 1, year: 2000, manual: false, mainUser: false, isDeleted: false, isMigrated: false, _id: 697e97c2a2b54163009c26e8, uid: test_user_123, profileId: 697e97c2a2b54163009c26e8, name: ToDelete, time: 00:00, timezone: 0, birthLocation: Test City, lat: 0, lng: 0, mainUserId: test_user_123, __v: 0} ✅ Response is already a Map 🔍 API Response keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) 🔍 Has "data" field? false 🔍 Has "profileId" field? true ✅ Creating UserProfile from apiResponse... 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) ✅ Remote create succeeded, user.id: 697e97c2a2b54163009c26e8 First user created, setting as main user... 🌐 POST: https://club.astromatrix.org/users/verifyprofile 📦 Payload: {uid: test_user_123, profileId: 697e97c2a2b54163009c26e8, verify: true} 💾 Saved to local storage 🗑️ UserService.deleteUser() called for: 697e97c2a2b54163009c26e8 💾 Deleted from local storage 🌐 RemoteUserBackend.deleteUser() - profileId: 697e97c2a2b54163009c26e8, userId: test_user_123 ✅ User deleted: Deleted 🌐 POST: https://club.astromatrix.org/users/erase 📦 Payload: {uid: test_user_123, profileId: 697e97c2a2b54163009c26e8} 📥 Delete response success: true ✅ Delete completed: User deleted successfully!
Test #104 (unknown) SUCCESS
Test #105 (unknown) SUCCESS
Logs: :microscope: Starting Astronomical Accuracy Tests...
Test #106 (unknown) SUCCESS
Logs: 🔍 Testing user lookup... 📝 UserService.createUser() called for: Lookup 🌐 Calling remote.createUser()... 🌐 RemoteUserBackend.createUser() called 📤 Sending payload: {uid: test_user_123, name: Lookup, day: 1, month: 1, year: 1980, time: 01:00, town: TestTown, timeOffset: 0, lat: 1.0, lng: 1.0, gender: true} 🌐 POST: https://club.astromatrix.org/users/addUser 📦 Payload: {uid: test_user_123, name: Lookup, day: 1, month: 1, year: 1980, time: 01:00, town: TestTown, timeOffset: 0, lat: 1.0, lng: 1.0, gender: true} 📥 Response success: true 📥 Response data type: _Map 📥 Response data: {day: 1, month: 1, year: 1980, manual: false, mainUser: false, isDeleted: false, isMigrated: false, _id: 697e97c2a2b54163009c26ea, uid: test_user_123, profileId: 697e97c2a2b54163009c26ea, name: Lookup, time: 01:00, timezone: 0, birthLocation: TestTown, lat: 1, lng: 1, mainUserId: test_user_123, __v: 0} ✅ Response is already a Map 🔍 API Response keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) 🔍 Has "data" field? false 🔍 Has "profileId" field? true ✅ Creating UserProfile from apiResponse... 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (day, month, year, manual, mainUser, isDeleted, ..., mainUserId, __v) ✅ Remote create succeeded, user.id: 697e97c2a2b54163009c26ea First user created, setting as main user... 🌐 POST: https://club.astromatrix.org/users/verifyprofile 📦 Payload: {uid: test_user_123, profileId: 697e97c2a2b54163009c26ea, verify: true} 💾 Saved to local storage 🔍 UserService.getUserById() called for: 697e97c2a2b54163009c26ea 🌐 RemoteUserBackend.getUserById() - userId: 697e97c2a2b54163009c26ea 🌐 GET: https://club.astromatrix.org/users/getUser/697e97c2a2b54163009c26ea 📥 Response success: true, data type: _Map ✅ Parsing user from response... 🔧 UserProfile.fromJson() parsing... 🔍 JSON keys: (id, username, birthtown, timeunknown, uid, fid, ..., subscribed, mainUser) ✅ Found user: Lookup 💾 Saved to local storage ✅ User found: Lookup
Test #107 (unknown) SUCCESS
Test #108 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🧪 TEST: Different Cache Keys (Different Types) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🚀 Request 1: type = self 🌐 [self] Starting API call ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 🚀 Request 2: type = transit 🌐 [transit] Starting API call ✅ [transit] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 📊 RESULTS: API calls made: 2 Cache writes: 2 ✅ TEST PASSED: Different cache keys work correctly
Test #109 (unknown) SUCCESS
Logs: 🔬 Testing Chart 1: Toulouse, France Birth: September 9, 1985, 9:20 PM 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Toulouse Found 1 location suggestions for 'Toulouse' (Advanced: false) Selecting location: Toulouse, , France 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Toulouse%2C%20%2C%20France 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=495148800&lat=43.60426&lng=1.44367 Location selected successfully: Toulouse, , France 📖 No value for houseSystem and no user logged in 📖 No value for timeSystem and no user logged in 📖 No value for orb and no user logged in 📖 No value for relationshipOrb and no user logged in 📖 No value for horoscopeOrb and no user logged in 📖 No value for isSmart and no user logged in 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test Chart 1, day: 9, month: 9, year: 1985, fullDate: 9/9/1985, fullDateStr: September 9th 1985 21:20, timeHour: 9, timeMinute: 20, timePM: PM, time: 21:20, town: Toulouse, , France, selectedTown: true, lat: 43.60426, lng: 1.44367, timeOffset: 120, dst: true, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:01, timeHour: null, timeMinute: null, timePM: null, time: 0:01, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ Sun: 17°2' Virgo (expected ~17° Virgo) - within tolerance ✅ Moon: 13°9' Cancer (expected ~13° Cancer) - within tolerance ✅ Ascendant: 18°43' Aries (expected ~18° Aries) - within tolerance ✅ Chart 1 verified within tolerance
Test #110 (unknown) SUCCESS
Logs: 🔬 Testing Chart 2: Denver, Colorado Birth: July 3, 1973, 12:23 AM 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Denver Found 5 location suggestions for 'Denver' (Advanced: false) Selecting location: Denver, Colorado, United States 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Denver%2C%20Colorado%2C%20United%20States 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=110506980&lat=39.73915&lng=-104.9847 Location selected successfully: Denver, Colorado, United States 📖 No value for houseSystem and no user logged in 📖 No value for timeSystem and no user logged in 📖 No value for orb and no user logged in 📖 No value for relationshipOrb and no user logged in 📖 No value for horoscopeOrb and no user logged in 📖 No value for isSmart and no user logged in 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test Chart 2, day: 3, month: 7, year: 1973, fullDate: 3/7/1973, fullDateStr: July 3rd 1973 0:23, timeHour: 12, timeMinute: 23, timePM: AM, time: 0:23, town: Denver, Colorado, United States, selectedTown: true, lat: 39.73915, lng: -104.9847, timeOffset: -360, dst: true, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:01, timeHour: null, timeMinute: null, timePM: null, time: 0:01, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ Sun: 11°11' Cancer (expected ~11° Cancer) - within tolerance ✅ Ascendant: 3°15' Aries (expected ~4° Aries) - within tolerance Moon: 19°49' Leo (not verified - no expected value) ✅ Chart 2 verified within tolerance
Test #111 (unknown) SUCCESS
Logs: 🔬 Testing Chart 3: Bairnsdale, Victoria, Australia Birth: February 7, 1984, 3:00 PM 🌐 GET: https://astromatrix.org/API/Utility/GetBirthLocations?query=Bairnsdale Found 1 location suggestions for 'Bairnsdale' (Advanced: false) Selecting location: Bairnsdale, Victoria, Australia 🌐 GET: https://astromatrix.org/API/Utility/GetBirthCityInfo?town=Bairnsdale%2C%20Victoria%2C%20Australia 🌐 GET: https://vip.timezonedb.com/v2/get-time-zone?key=0BJLGR4U2RZB&format=json&by=position&time=445014000&lat=-37.82289&lng=147.61041 Location selected successfully: Bairnsdale, Victoria, Australia 📖 No value for houseSystem and no user logged in 📖 No value for timeSystem and no user logged in 📖 No value for orb and no user logged in 📖 No value for relationshipOrb and no user logged in 📖 No value for horoscopeOrb and no user logged in 📖 No value for isSmart and no user logged in 🌐 POST: https://astromatrix.org/API/Astrology/CalcPositions 📦 Payload: {type: birthchart, typename: Birth, path: /edituser, date1: ChartDate(name: Test Chart 3, day: 7, month: 2, year: 1984, fullDate: 7/2/1984, fullDateStr: February 7th 1984 15:00, timeHour: 3, timeMinute: 00, timePM: PM, time: 15:00, town: Bairnsdale, Victoria, Australia, selectedTown: true, lat: -37.82289, lng: 147.61041, timeOffset: 660, dst: true, noTime: false, bio: null, mainUser: false, type: Birth), date2: null, transitDate: ChartDate(name: null, day: 1, month: 2, year: 2026, fullDate: 1/2/2026, fullDateStr: February 1st 2026 0:01, timeHour: null, timeMinute: null, timePM: null, time: 0:01, town: null, selectedTown: null, lat: null, lng: null, timeOffset: 0, dst: null, noTime: null, bio: null, mainUser: null, type: null), houseSystemStr: Placidus, houseSystem: P, mobile: true, version: 2.5, constraints: 8, smartOrb: false, descriptions: true, famous: false, sidereal: false, serviceType: Display, getPatterns: false, uid: null, fid: null, progressedDate: null} ✅ Sun: 17°34' Aquarius (expected ~17° Aquarius) - within tolerance ✅ Moon: 13°52' Aries (expected ~13° Aries) - within tolerance ✅ Ascendant: 29°46' Taurus (expected ~29° Taurus) - within tolerance ✅ Chart 3 verified within tolerance
Test #112 (unknown) SUCCESS
Logs: 📊 ACCURACY TEST SUMMARY ================================================== Tested 3 known birth charts Tolerance: ±2 degrees (standard in astrology) All charts verified successfully! ✅ ==================================================
Test #113 (unknown) SUCCESS
Logs: ✅ Accuracy tests completed!
Test #114 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🧪 TEST: Different Cache Keys (Different Users) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🚀 Request 1: user1 = test-user-123 🌐 [self] Starting API call ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 🔄 Switching to user: test-user-456 ⚠️ Cannot save preference chart_service_user1_id: No user logged in 🚀 Request 2: user1 = test-user-456 🌐 [self] Starting API call ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 📊 RESULTS: API calls made: 2 Cache writes: 2 ✅ TEST PASSED: Different users work correctly
Test #115 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🧪 TEST: Staggered Requests (Realistic Timing) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🚀 Request 1: Started 🌐 [self] Starting API call 🚀 Request 2: Started (500ms after request 1) ⏳ [self] Reusing in-flight request ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 📊 RESULTS: API calls made: 1 Both succeeded: true ✅ TEST PASSED: Staggered requests deduplicate correctly
Test #116 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🧪 TEST: Cache Disabled (useCache=false) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🚀 Request 1: useCache=false 🌐 [self] Starting API call ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 🚀 Request 2: useCache=false 🌐 [self] Starting API call ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 📊 RESULTS: API calls made: 2 Result 1 from cache: false Result 2 from cache: false ✅ TEST PASSED: Cache bypass works correctly
Test #117 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🧪 PERFORMANCE TEST: 10 Simultaneous Requests ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🌐 [self] Starting API call ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ⏳ [self] Reusing in-flight request (late arrival) ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 📊 RESULTS: Total time: 105ms API calls made: 1 All succeeded: true Expected time (without dedup): ~1000ms Actual time (with dedup): 105ms Time saved: ~895ms ✅ TEST PASSED: Performance is optimal with deduplication
Test #118 (unknown) SUCCESS
Logs: ⚠️ Cannot save preference chart_service_user1_id: No user logged in ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 🧪 PERFORMANCE TEST: Cache Retrieval Speed ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 📦 Populating cache... 🌐 [self] Starting API call ✅ [self] API call completed and enriched 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in ⏱️ Measuring cache retrieval speed... 📖 No value for showPlanets and no user logged in 📖 No value for showAspects and no user logged in 📖 No value for showChiron and no user logged in 📖 No value for showCeres and no user logged in 📖 No value for showJuno and no user logged in 📖 No value for showPallas and no user logged in 📖 No value for showLilith and no user logged in 📖 No value for showVesta and no user logged in 📖 No value for showEris and no user logged in 📖 No value for showFortune and no user logged in 📖 No value for showEros and no user logged in 📖 No value for showPsyche and no user logged in 📖 No value for isMinor and no user logged in 📊 RESULTS: Cache retrieval time: 2ms From cache: true Success: true ✅ TEST PASSED: Cache retrieval is fast
Test #119 (unknown) SUCCESS