hrms-checkin/docs/test-steps-location.md
waruneeauy 7fdece0a28
All checks were successful
Build & Deploy on Dev / build (push) Successful in 4m20s
add test case and test step location
2026-03-09 11:43:57 +07:00

47 KiB

Test Steps: Location Features

HRMS Check-in/Check-out System

Document Information

Field Value
Document Version 1.0.0
Last Updated 2025-03-09
Project HRMS Check-in/Check-out
Module Location Features
Author QA Team

Table of Contents

  1. Overview
  2. Test Environment Setup
  3. Manual Testing Procedures
  4. Mock Location Testing
  5. Developer Tools Testing
  6. Device-Specific Testing
  7. Test Data & Scenarios
  8. Troubleshooting

1. Overview

เอกสารนี้ประกอบด้วยขั้นตอนการทดสอบ (Test Steps) แบบละเอียดสำหรับการทดสอบฟีเจอร์ Location ของระบบ HRMS Check-in/Check-out โดยเน้นการทดสอบแบบ Manual Testing และการจำลองสถานการณ์ต่าง ๆ

1.1 Testing Scope

Area Description
Location Permission การขอและการจัดการสิทธิ์การเข้าถึงตำแหน่ง
Location Acquisition การรับพิกัด GPS จากอุปกรณ์
Location Validation การตรวจสอบความถูกต้องของตำแหน่ง
Mock Detection การตรวจจับการจำลองตำแหน่ง
POI Resolution การแปลงพิกัดเป็นชื่อสถานที่
Check-in/Check-out การลงเวลาเข้า-ออกงานพร้อมตำแหน่ง
Privacy Consent การขอความยินยอมการใช้ข้อมูล

2. Test Environment Setup

2.1 Device Preparation

2.1.1 Android Device Setup

  1. Enable Developer Options

    • เปิด Settings > About Phone
    • แตะที่ Build Number 7 ครั้ง
    • กลับมาที่ Settings > Developer Options
  2. Enable Mock Location (สำหรับการทดสอบ)

    • เปิด Settings > Developer Options
    • เลือก "Select mock location app"
    • เลือก Fake GPS Location App ที่ติดตั้ง
  3. Install Fake GPS Apps

2.1.2 iOS Device Setup

  1. Xcode Simulation (ต้องใช้ Mac)

    • เปิด Xcode
    • เลือก Device > Debug Location > Custom Location...
    • ป้อน Latitude และ Longitude
  2. Location Changer Apps

2.1.3 Desktop Browser Setup

  1. Chrome DevTools

    • กด F12 หรือ Cmd+Option+I (Mac) / Ctrl+Shift+I (Windows)
    • เลือก More tools > Sensors
    • ตั้งค่า Location ใน Sensors tab
  2. Edge DevTools

    • กด F12
    • เลือก More tools > Sensors
    • ตั้งค่า Location ใน Sensors tab

2.2 Network Setup

Scenario Setup
Normal Network WiFi/4G/5G เชื่อมต่อปกติ
Slow Network Chrome DevTools > Network > Throttling > Slow 3G
Offline Chrome DevTools > Network > Offline
GPS Blocking Disable Location Service ในระบบ

2.3 Test Location Data

Location Name Latitude Longitude Notes
Sanam Suea Pa (สนามเสือป่า) 13.7563 100.5018 Bangkok Government Office
Suvarnabhumi Airport 13.6900 100.7501 Outdoor, high GPS accuracy
Central World 13.7944 100.5439 Indoor shopping mall
Null Island 0 0 Default mock location (invalid)
Out of Range 91 181 Invalid coordinates
Chiang Mai 18.7883 98.9853 Northern Thailand

3. Manual Testing Procedures

3.1 TC-LOC-01: Location Permission Testing

Test Case: TC-LOC-01-01 - อนุญาตให้เข้าถึงตำแหน่ง

Objective: ทดสอบการอนุญาตให้เข้าถึงตำแหน่ง

Step Action Expected Result Screenshot
1 เปิดแอป HRMS ครั้งแรก แสดงหน้าแรกของแอป [ ]
2 แสดง Privacy Modal (ถ้ายังไม่ยอมรับ) แสดง Privacy Policy Modal [ ]
3 กด "ยอมรับ" เพื่อยอมรับ Privacy Policy Modal ปิด, isAccepted = true [ ]
4 กดปุ่มขอตำแหน่ง (mapRef.requestLocationPermission()) ระบบขอ Location Permission [ ]
5 เลือก "Allow" เมื่อระบบขอ Location Permission รับสิทธิ์สำเร็จ [ ]
6 รอรับพิกัด GPS แสดง Skeleton loading [ ]
7 รับพิกัดสำเร็จ แสดงแผนที่พร้อมตำแหน่งปัจจุบัน [ ]
8 ตรวจสอบชื่อสถานที่ใกล้เคียง แสดงชื่อสถานที่ (POI) [ ]
9 ตรวจสอบสถานะปุ่มลงเวลา ปุ่มใช้งานได้ (disabled = false) [ ]

Verification Checklist:

  • แผนที่แสดงตำแหน่งปัจจุบันถูกต้อง
  • ชื่อสถานที่ใกล้เคียงแสดงถูกต้อง
  • locationGranted = true
  • ปุ่มลงเวลาเข้า/ออกใช้งานได้
  • ไม่มีข้อความ error แสดงขึ้น

Test Case: TC-LOC-01-02 - ปฏิเสธการเข้าถึงตำแหน่ง

Objective: ทดสอบการปฏิเสธการเข้าถึงตำแหน่ง

Step Action Expected Result Screenshot
1 เปิดแอป HRMS ครั้งแรก แสดงหน้าแรกของแอป [ ]
2 ยอมรับ Privacy Policy Modal ปิด [ ]
3 กดปุ่มขอตำแหน่ง ระบบขอ Location Permission [ ]
4 เลือก "Deny" เมื่อระบบขอ Location Permission ปฏิเสธสิทธิ์ [ ]
5 ตรวจสอบ error message แสดง "ไม่สามารถระบุตำแหน่งปัจจุบันได้ เนื่องจากคุณปฏิเสธการเข้าถึงตำแหน่ง กรุณาเปิดการเข้าถึงตำแหน่ง" [ ]
6 ตรวจสอบแผนที่ แผนที่ไม่แสดง (poiPlaceName = '') [ ]
7 ตรวจสอบปุ่มลงเวลา ปุ่มใช้งานไม่ได้ (disabled = true) [ ]

Verification Checklist:

  • แสดง error message ถูกต้อง
  • แผนที่ไม่แสดง
  • locationGranted = false
  • ปุ่มลงเวลาเข้า/ออก disabled
  • ไม่สามารถลงเวลาได้

3.2 TC-LOC-02: Location Acquisition Testing

Test Case: TC-LOC-02-01 - รับพิกัด GPS สำเร็จ (Outdoor)

Objective: ทดสอบการรับพิกัด GPS สำเร็จในพื้นที่เปิดกว้าง

Step Action Expected Result Screenshot
1 ไปยังพื้นที่เปิดกว้าง (Outdoor) อยู่กลางแจ้ง มีสัญญาณ GPS ดี [ ]
2 เปิดแอป HRMS แสดงหน้าแรก [ ]
3 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
4 กดปุ่มขอตำแหน่ง เริ่มรับพิกัด GPS [ ]
5 รอรับพิกัด (ประมาณ 3-5 วินาที) แสดง Skeleton loading [ ]
6 รับพิกัดสำเร็จ แสดงแผนที่ [ ]
7 ตรวจสอบพิกัด Latitude และ Longitude ถูกต้อง [ ]
8 ตรวจสอบความแม่นยำ Accuracy <= 100 meters [ ]
9 ตรวจสอบ timestamp Timestamp ภายใน 60 วินาที [ ]
10 ตรวจสอบชื่อสถานที่ แสดงชื่อสถานที่ใกล้เคียง [ ]

Verification Checklist:

  • รับพิกัดสำเร็จ
  • พิกัดอยู่ในช่วงที่ถูกต้อง (lat: -90 to 90, lon: -180 to 180)
  • ไม่ใช่ (0, 0)
  • Accuracy <= 100 meters
  • Timestamp ภายใน 60 วินาที
  • ชื่อสถานที่ใกล้เคียงแสดงถูกต้อง

Test Case: TC-LOC-02-02 - รับพิกัด GPS สำเร็จ (Indoor)

Objective: ทดสอบการรับพิกัด GPS สำเร็จในพื้นที่ปิด

Step Action Expected Result Screenshot
1 ไปยังพื้นที่ปิด (Indoor) อยู่ภายในอาคาร [ ]
2 เปิดแอป HRMS แสดงหน้าแรก [ ]
3 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
4 กดปุ่มขอตำแหน่ง เริ่มรับพิกัด GPS [ ]
5 รอรับพิกัด (อาจนานกว่าปกติ) แสดง Skeleton loading [ ]
6 รับพิกัดสำเร็จ แสดงแผนที่ [ ]
7 ตรวจสอบพิกัด Latitude และ Longitude ถูกต้อง [ ]
8 ตรวจสอบความแม่นยำ อาจมีความแม่นยำต่ำกว่า Outdoor [ ]

Verification Checklist:

  • รับพิกัดสำเร็จ
  • อาจมีความแม่นยำต่ำกว่า Outdoor
  • แผนที่แสดงถูกต้อง

Test Case: TC-LOC-02-03 - รับพิกัด GPS ล้มเหลว (GPS ไม่ทำงาน)

Objective: ทดสอบกรณี GPS ไม่ทำงาน

Step Action Expected Result Screenshot
1 เปิดแอป HRMS แสดงหน้าแรก [ ]
2 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
3 ไปที่ Settings > Location > ปิด GPS GPS ปิดอยู่ [ ]
4 กดปุ่มขอตำแหน่ง เริ่มรับพิกัด GPS [ ]
5 ตรวจสอบ error message แสดง "ไม่สามารถระบุตำแหน่งปัจจุบันได้" [ ]
6 ตรวจสอบแผนที่ แผนที่ไม่แสดง [ ]

Verification Checklist:

  • แสดง error message ถูกต้อง
  • แผนที่ไม่แสดง
  • ไม่สามารถรับพิกัดได้

3.3 TC-LOC-03: Location Validation Testing

Test Case: TC-LOC-03-01 - พิกัดถูกต้อง (Valid coordinates)

Objective: ทดสอบการตรวจสอบพิกัดที่ถูกต้อง

Step Action Expected Result Screenshot
1 เปิดแอป HRMS แสดงหน้าแรก [ ]
2 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
3 รับพิกัด GPS ปกติ พิกัดถูกต้อง (เช่น 13.7563, 100.5018) [ ]
4 เปิด Console และตรวจสอบ validationResult { isValid: true, isMockDetected: false } [ ]
5 ตรวจสอบ locationGranted locationGranted = true [ ]
6 ตรวจสอบปุ่มลงเวลา ปุ่มใช้งานได้ [ ]

Verification Checklist:

  • validationResult.isValid = true
  • validationResult.isMockDetected = false
  • validationResult.errors = []
  • locationGranted = true
  • ไม่มี error/warning message

Test Case: TC-LOC-03-02 - พิกัดไม่ถูกต้อง (Invalid coordinates - (0,0))

Objective: ทดสอบการตรวจสอบพิกัด (0,0)

Step Action Expected Result Screenshot
1 เปิด Fake GPS App เปิดแอป [ ]
2 ตั้งค่าพิกัด (0, 0) Latitude: 0, Longitude: 0 [ ]
3 เปิดแอป HRMS แสดงหน้าแรก [ ]
4 กดปุ่มขอตำแหน่ง เริ่มรับพิกัด GPS [ ]
5 ตรวจสอบ Console (validateCoordinates) validateCoordinates(0, 0) = false [ ]
6 ตรวจสอบ validationResult { isValid: false, isMockDetected: true, confidence: 'high' } [ ]
7 ตรวจสอบ error message "พิกัดตำแหน่งไม่ถูกต้อง กรุณาลองใหม่" [ ]
8 ตรวจสอบ disabledBtn disabledBtn = true [ ]

Verification Checklist:

  • validateCoordinates(0, 0) = false
  • mockIndicators = 3
  • isMockDetected = true
  • confidence = 'high'
  • แสดง error message ถูกต้อง
  • ปุ่มลงเวลา disabled

Test Case: TC-LOC-03-04 - ข้อมูลตำแหน่งเก่าเกินไป (Stale timestamp)

Objective: ทดสอบการตรวจสอบ timestamp เก่าเกิน 60 วินาที

Step Action Expected Result Screenshot
1 เปิด Chrome DevTools F12 > Sensors [ ]
2 เลือก Custom Location กำหนดพิกัด [ ]
3 เปิด Console และเขียน script จำลอง timestamp เก่า [ ]
4 Run script:
```javascript
const stalePosition = {
coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 10 },
timestamp: Date.now() - 70000 // 70 seconds ago
}
navigator.geolocation.getCurrentPosition(pos => console.log(pos))
```
5 รีเฟรชแอป รับพิกัด [ ]
6 ตรวจสอบ validationResult mockIndicators += 2 [ ]
7 ตรวจสอบ error message "ข้อมูลตำแหน่งเก่าเกินไป กรุณารับสัญญาณ GPS ใหม่" [ ]

Verification Checklist:

  • validateTimestamp(staleTimestamp) = false
  • mockIndicators += 2
  • แสดง error message ถูกต้อง

Test Case: TC-LOC-03-05 - ความแม่นยำต่ำ (Poor accuracy)

Objective: ทดสอบการตรวจสอบความแม่นยำต่ำ

Step Action Expected Result Screenshot
1 เปิด Chrome DevTools F12 > Sensors [ ]
2 เลือก Custom Location กำหนดพิกัด [ ]
3 เปิด Console และเขียน script จำลอง accuracy ต่ำ [ ]
4 Run script:
```javascript
const poorAccuracyPosition = {
coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 150 },
timestamp: Date.now()
}
```
5 รีเฟรชแอป รับพิกัด [ ]
6 ตรวจสอบ validationResult warnings = ["ความแม่นยำตำแหน่งต่ำเกินไป..."] [ ]
7 ตรวจสอบ mockIndicators mockIndicators += 1 [ ]

Verification Checklist:

  • validateAccuracy(150) = false
  • mockIndicators += 1
  • แสดง warning message ถูกต้อง

Test Case: TC-LOC-03-06 - ความเร็วเคลื่อนที่ผิดปกติ (Impossible speed)

Objective: ทดสอบการตรวจสอบความเร็วเคลื่อนที่ผิดปกติ

Step Action Expected Result Screenshot
1 เปิดแอป HRMS ที่ตำแหน่ง A (13.7563, 100.5018) รับพิกัด A [ ]
2 รอสักครู่เพื่อให้บันทึกตำแหน่ง A ลง history previousPositions มีค่า [ ]
3 เปิด Fake GPS App เปิดแอป [ ]
4 ตั้งค่าพิกัด B (15.8700, 100.9925) ที่ห่างกัน ~180 กม. พิกัด B [ ]
5 รีเฟรชแอปทันที (ภายใน 60 วินาที) รับพิกัด B [ ]
6 ตรวจสอบ Console (calculateSpeed) speed = ~3000 km/h (> 100 m/s) [ ]
7 ตรวจสอบ validationResult mockIndicators += 3 [ ]
8 ตรวจสอบ error message "ตรวจพบการเคลื่อนที่ด้วยความเร็วผิดปกติ..." [ ]

Verification Checklist:

  • calculateSpeed() = ความเร็ว > 100 m/s
  • mockIndicators += 3
  • แสดง error message ถูกต้อง

3.4 TC-LOC-04: Mock Location Detection Testing

Test Case: TC-LOC-04-01 - ไม่พบ Mock Location (Normal GPS)

Objective: ทดสอบการใช้งาน GPS ปกติ ไม่พบ mock location

Step Action Expected Result Screenshot
1 ตรวจสอบว่าปิด Fake GPS App ไม่มี Fake GPS App ทำงาน [ ]
2 เปิดแอป HRMS แสดงหน้าแรก [ ]
3 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
4 กดปุ่มขอตำแหน่ง เริ่มรับพิกัด GPS [ ]
5 รับพิกัดสำเร็จ แสดงแผนที่ [ ]
6 ตรวจสอบ Console (validationResult) { isValid: true, isMockDetected: false } [ ]
7 ตรวจสอบ locationGranted locationGranted = true [ ]
8 ตรวจสอบ isMockLocationDetected isMockLocationDetected = false [ ]
9 ตรวจสอบปุ่มลงเวลา ปุ่มใช้งานได้ [ ]

Verification Checklist:

  • isValid = true
  • isMockDetected = false
  • locationGranted = true
  • isMockLocationDetected = false
  • ปุ่มลงเวลาใช้งานได้

Test Case: TC-LOC-04-02 - พบ Mock Location - Fake GPS App

Objective: ทดสอบการตรวจจับ mock location จาก Fake GPS App

Step Action Expected Result Screenshot
1 เปิด Fake GPS Location App เปิดแอป [ ]
2 ตั้งค่าตำแหน่งปลอง (เช่น 13.7563, 100.5018) ตั้งค่าสำเร็จ [ ]
3 เปิด Developer Options > Select mock location app เลือก Fake GPS App [ ]
4 เปิดแอป HRMS แสดงหน้าแรก [ ]
5 กดปุ่มขอตำแหน่ง เริ่มรับพิกัด GPS [ ]
6 รับพิกัดจาก Fake GPS แสดงพิกัดปลอง [ ]
7 ตรวจสอบ Console (validationResult) isMockDetected = true [ ]
8 ตรวจสอบ mockIndicators mockIndicators >= 3 [ ]
9 ตรวจสอบ error message "ตรวจพบว่าตำแหน่ง GPS อาจไม่ถูกต้อง..." [ ]
10 ตรวจสอบ isMockLocationDetected isMockLocationDetected = true [ ]
11 ตรวจสอบ disabledBtn disabledBtn = true [ ]
12 พยายามกดปุ่มลงเวลา กดไม่ได้ [ ]

Verification Checklist:

  • isMockDetected = true
  • mockIndicators >= 3
  • แสดง error message ถูกต้อง
  • isMockLocationDetected = true
  • disabledBtn = true
  • ไม่สามารถลงเวลาได้

3.5 TC-LOC-05: POI Resolution Testing

Test Case: TC-LOC-05-01 - แปลงพิกัดเป็นชื่อสถานที่สำเร็จ (Bangkok GIS)

Objective: ทดสอบการแปลงพิกัดเป็นชื่อสถานที่สำเร็จผ่าน Bangkok GIS API

Step Action Expected Result Screenshot
1 เปิดแอป HRMS แสดงหน้าแรก [ ]
2 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
3 กดปุ่มขอตำแหน่ง เริ่มรับพิกัด GPS [ ]
4 รับพิกัดสำเร็จ แสดงแผนที่ [ ]
5 เปิด Network Tab (DevTools) แสดง requests [ ]
6 ตรวจสอบ request ไป Bangkok GIS GET https://bmagis.bangkok.go.th/... [ ]
7 ตรวจสอบ response status = 200, มี PlaceName [ ]
8 ตรวจสอบ poiPlaceName poiPlaceName มีค่า [ ]
9 ตรวจสอบ formLocation.POI formLocation.POI มีค่า [ ]
10 ตรวจสอบหน้าจอ แสดงชื่อสถานที่ใกล้เคียง [ ]

Verification Checklist:

  • เรียก Bangkok GIS API สำเร็จ
  • Response มี PlaceName
  • poiPlaceName มีค่า
  • แสดงชื่อสถานที่ใกล้เคียงถูกต้อง

Test Case: TC-LOC-05-02 - แปลงพิกัดเป็นชื่อสถานที่สำเร็จ (ArcGIS Fallback)

Objective: ทดสอบการแปลงพิกัดเป็นชื่อสถานที่สำเร็จผ่าน ArcGIS API (เมื่อ Bangkok GIS fail)

Step Action Expected Result Screenshot
1 เปิด Chrome DevTools > Network Tab แสดง requests [ ]
2 เปิด Throttling > Offline จำลอง Bangkok GIS down [ ]
3 เปิดแอป HRMS แสดงหน้าแรก [ ]
4 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
5 กดปุ่มขอตำแหน่ง เริ่มรับพิกัด GPS [ ]
6 รับพิกัดสำเร็จ แสดงแผนที่ [ ]
7 ปิด Throttling (กลับสู่ Online) Bangkok GIS ยังไม่พร้อม [ ]
8 ตรวจสอบ Console Bangkok GIS API fail [ ]
9 ตรวจสอบ fallback เรียก ArcGIS API [ ]
10 ตรวจสอบ response GET https://geocode.arcgis.com/... [ ]
11 ตรวจสอบ poiPlaceName poiPlaceName มีค่า [ ]

Verification Checklist:

  • Bangkok GIS API fail
  • Fallback ไป ArcGIS API สำเร็จ
  • poiPlaceName มีค่า
  • แสดงชื่อสถานที่ใกล้เคียง

3.6 TC-LOC-06: Check-in with Location Testing

Test Case: TC-LOC-06-01 - ลงเวลาเข้าสำเร็จ - ณ สถานที่ตั้ง (In-place)

Objective: ทดสอบการลงเวลาเข้าสำเร็จเมื่ออยู่ ณ สถานที่ตั้ง

Step Action Expected Result Screenshot
1 เปิดแอป HRMS แสดงหน้าแรก [ ]
2 ตรวจสอบ statusCheckin statusCheckin = true (เข้างาน) [ ]
3 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
4 กดปุ่มขอตำแหน่ง รับพิกัดสำเร็จ [ ]
5 ถ่ายรูปภาพ แสดงรูปที่ถ่าย [ ]
6 เลือก "ในสถานที่" workplace = 'in-place' [ ]
7 กด "ลงเวลาเข้างาน" แสดง dialog ยืนยัน [ ]
8 ตรวจสอบ dialog message "ยืนยันการลงเวลาเข้างาน ในสถานที่..." [ ]
9 กด "ยืนยัน" ส่งข้อมูลไป API [ ]
10 เปิด Network Tab POST /leave/check-in [ ]
11 ตรวจสอบ payload { lat, lon, POI, isLocation: true, locationName: '', img, remark } [ ]
12 ตรวจสอบ response status = 200 [ ]
13 ตรวจสอบ modal แสดง modal ลงเวลาเข้างานสำเร็จ [ ]
14 ตรวจสอบ statusCheckin statusCheckin = false [ ]

Verification Checklist:

  • API call ถูกต้อง
  • Payload ถูกต้อง (isLocation: true, locationName: '')
  • Response status 200
  • แสดง modal สำเร็จ
  • statusCheckin = false

Test Case: TC-LOC-06-02 - ลงเวลาเข้าสำเร็จ - นอกสถานที่ตั้ง (Off-site)

Objective: ทดสอบการลงเวลาเข้าสำเร็จเมื่ออยู่นอกสถานที่ตั้ง

Step Action Expected Result Screenshot
1 เปิดแอป HRMS แสดงหน้าแรก [ ]
2 ตรวจสอบ statusCheckin statusCheckin = true (เข้างาน) [ ]
3 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
4 กดปุ่มขอตำแหน่ง รับพิกัดสำเร็จ [ ]
5 ถ่ายรูปภาพ แสดงรูปที่ถ่าย [ ]
6 เลือก "นอกสถานที่" workplace = 'off-site' [ ]
7 เลือก "ปฏิบัติงานที่บ้าน (WFH)" model = 'ปฏิบัติงานที่บ้าน (WFH)' [ ]
8 ตรวจสอบ useLocation useLocation = 'ปฏิบัติงานที่บ้าน (WFH)' [ ]
9 กด "ลงเวลาเข้างาน" แสดง dialog ยืนยัน [ ]
10 ตรวจสอบ dialog message "ยืนยันการลงเวลาเข้างาน นอกสถานที่ (ปฏิบัติงานที่บ้าน (WFH))..." [ ]
11 กด "ยืนยัน" ส่งข้อมูลไป API [ ]
12 เปิด Network Tab POST /leave/check-in [ ]
13 ตรวจสอบ payload { lat, lon, POI, isLocation: false, locationName: 'ปฏิบัติงานที่บ้าน (WFH)', img, remark } [ ]
14 ตรวจสอบ response status = 200 [ ]

Verification Checklist:

  • API call ถูกต้อง
  • Payload ถูกต้อง (isLocation: false, locationName มีค่า)
  • Response status 200
  • แสดง modal สำเร็จ

Test Case: TC-LOC-06-03 - ลงเวลาเข้าล้มเหลว - Mock Location detected

Objective: ทดสอบการลงเวลาเข้าล้มเหลวเมื่อตรวจพบ mock location

Step Action Expected Result Screenshot
1 เปิด Fake GPS Location App เปิดแอป [ ]
2 ตั้งค่าตำแหน่งปลอง ตั้งค่าสำเร็จ [ ]
3 เปิดแอป HRMS แสดงหน้าแรก [ ]
4 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
5 กดปุ่มขอตำแหน่ง เริ่มรับพิกัด GPS [ ]
6 รับพิกัดจาก Fake GPS ตรวจจับ mock location [ ]
7 ตรวจสอบ error message "ตรวจพบว่าตำแหน่ง GPS อาจไม่ถูกต้อง..." [ ]
8 ตรวจสอบ isMockLocationDetected isMockLocationDetected = true [ ]
9 ตรวจสอบ disabledBtn disabledBtn = true [ ]
10 ถ่ายรูปภาพ แสดงรูปที่ถ่าย [ ]
11 พยายามกด "ลงเวลาเข้างาน" กดไม่ได้ (ปุ่ม disabled) [ ]

Verification Checklist:

  • ตรวจจับ mock location สำเร็จ
  • isMockLocationDetected = true
  • disabledBtn = true
  • ไม่สามารถลงเวลาเข้างานได้

3.7 TC-LOC-07: Check-out with Location Testing

Test Case: TC-LOC-07-01 - ลงเวลาออกสำเร็จ

Objective: ทดสอบการลงเวลาออกสำเร็จพร้อมตำแหน่ง

Step Action Expected Result Screenshot
1 เปิดแอป HRMS แสดงหน้าแรก [ ]
2 ตรวจสอบ statusCheckin statusCheckin = false (ออกงาน) [ ]
3 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
4 กดปุ่มขอตำแหน่ง รับพิกัดสำเร็จ [ ]
5 ถ่ายรูปภาพ แสดงรูปที่ถ่าย [ ]
6 กด "ลงเวลาออกงาน" เรียก checkoutCheck API [ ]
7 เปิด Network Tab GET /leave/user/checkout-check/N [ ]
8 ตรวจสอบ response status = 'NORMAL' หรือ 'ABSENT' [ ]
9 ตรวจสอบ dialog แสดง dialog ยืนยันการลงเวลาออกงาน [ ]
10 กด "ยืนยัน" ส่งข้อมูลไป API [ ]
11 เปิด Network Tab POST /leave/check-in [ ]
12 ตรวจสอบ payload { lat, lon, POI, isLocation, locationName, img, remark, checkInId } [ ]
13 ตรวจสอบ response status = 200 [ ]
14 ตรวจสอบ modal แสดง modal ลงเวลาออกงานสำเร็จ [ ]
15 ตรวจสอบ statusCheckin statusCheckin = true [ ]

Verification Checklist:

  • checkoutCheck API ถูกต้อง
  • API call ถูกต้อง (มี checkInId)
  • Response status 200
  • แสดง modal สำเร็จ
  • statusCheckin = true

Test Case: TC-LOC-09-01 - แสดง Privacy Modal ก่อนใช้ Location

Objective: ทดสอบการแสดง Privacy Modal ก่อนใช้ Location

Step Action Expected Result Screenshot
1 เปิดแอป HRMS ครั้งแรก (หรือ clear localStorage) แสดงหน้าแรก [ ]
2 ตรวจสอบ privacyStore.isAccepted isAccepted = false [ ]
3 กดปุ่มที่ต้องการ Location (แผนที่/กล้อง) checkPrivacyAccepted() return false [ ]
4 ตรวจสอบ privacyStore.modalPrivacy modalPrivacy = true [ ]
5 ตรวจสอบ Privacy Modal แสดง Privacy Modal [ ]
6 ตรวจสอบว่าไม่สามารถใช้งาน Location ได้ แผนที่/กล้องไม่ทำงาน [ ]

Verification Checklist:

  • isAccepted = false
  • modalPrivacy = true
  • แสดง Privacy Modal
  • ไม่สามารถใช้งาน Location ได้

Test Case: TC-LOC-09-02 - ยอมรับ Privacy Policy

Objective: ทดสอบการยอมรับ Privacy Policy

Step Action Expected Result Screenshot
1 เปิดแอป HRMS ครั้งแรก แสดงหน้าแรก [ ]
2 แสดง Privacy Modal แสดง Privacy Modal [ ]
3 กด "ยอมรับ" เรียก privacyStore.setAccepted(true) [ ]
4 ตรวจสอบ privacyStore.isAccepted isAccepted = true [ ]
5 ตรวจสอบ privacyStore.modalPrivacy modalPrivacy = false [ ]
6 ตรวจสอบ Privacy Modal Modal ปิด [ ]
7 กดปุ่มขอตำแหน่ง เรียก mapRef.value?.requestLocationPermission() [ ]
8 อนุญาต Location Permission รับสิทธิ์สำเร็จ [ ]
9 รับพิกัดสำเร็จ แสดงแผนที่ [ ]

Verification Checklist:

  • isAccepted = true
  • modalPrivacy = false
  • Modal ปิด
  • สามารถใช้งาน Location ได้

Test Case: TC-LOC-09-03 - ปฏิเสธ Privacy Policy

Objective: ทดสอบการปฏิเสธ Privacy Policy

Step Action Expected Result Screenshot
1 เปิดแอป HRMS ครั้งแรก แสดงหน้าแรก [ ]
2 แสดง Privacy Modal แสดง Privacy Modal [ ]
3 กด "ปฏิเสธ" หรือปิด Modal เรียก privacyStore.modalPrivacy = false [ ]
4 ตรวจสอบ privacyStore.isAccepted isAccepted = false [ ]
5 ตรวจสอบ privacyStore.modalPrivacy modalPrivacy = false [ ]
6 ตรวจสอบ Privacy Modal Modal ปิด [ ]
7 กดปุ่มขอตำแหน่ง checkPrivacyAccepted() return false [ ]
8 ตรวจสอบ Privacy Modal แสดงอีกครั้ง [ ]

Verification Checklist:

  • isAccepted = false
  • modalPrivacy = false
  • Modal ปิด
  • ไม่สามารถใช้งาน Location ได้
  • แจ้งเตือนเมื่อพยายามใช้งาน Location

4. Mock Location Testing

4.1 Fake GPS Apps for Testing

4.1.1 Android Fake GPS Apps

App Name Link Features
Fake GPS Location Play Store Simple location spoofing
GPS Joystick Play Store Joystick control, route simulation
Mock GPS Play Store Multiple location saving

4.1.2 iOS Fake GPS Apps

App Name Link Features
Location Changer App Store Location spoofing (needs jailbreak)
Xcode Simulation - Built-in location simulation

4.2 Mock Location Test Scenarios

Scenario 1: Basic Mock Location

  1. Setup

    • เปิด Fake GPS Location App
    • ตั้งค่าตำแหน่ง: 13.7563, 100.5018 (Sanam Suea Pa)
    • ตั้งค่าความแม่นยำ: 10 meters
  2. Execute

    • เปิดแอป HRMS
    • กดปุ่มขอตำแหน่ง
    • ตรวจสอบผลลัพธ์
  3. Expected

    • ตรวจจับ mock location (indicators >= 3)
    • แสดง error message
    • ปุ่มลงเวลา disabled

Scenario 2: Rapid Location Change

  1. Setup

    • เปิดแอป HRMS ที่ตำแหน่ง A (13.7563, 100.5018)
    • รอสักครู่เพื่อให้บันทึกตำแหน่ง A ลง history
  2. Execute

    • เปิด Fake GPS App
    • เปลี่ยนตำแหน่งไป B (15.8700, 100.9925)
    • รีเฟรชแอป HRMS ทันที (ภายใน 60 วินาที)
  3. Expected

    • คำนวณความเร็ว = ~3000 km/h (> 100 m/s)
    • mockIndicators += 3
    • แสดง error: "ตรวจพบการเคลื่อนที่ด้วยความเร็วผิดปกติ..."

Scenario 3: Null Island (0,0)

  1. Setup

    • เปิด Fake GPS App
    • ตั้งค่าตำแหน่ง: 0, 0 (Null Island)
  2. Execute

    • เปิดแอป HRMS
    • กดปุ่มขอตำแหน่ง
  3. Expected

    • validateCoordinates(0, 0) = false
    • mockIndicators += 3
    • แสดง error: "พิกัดตำแหน่งไม่ถูกต้อง กรุณาลองใหม่"

5. Developer Tools Testing

5.1 Chrome DevTools Sensor Simulation

5.1.1 Enable Sensors

  1. เปิด Chrome DevTools (F12)
  2. เลือก More tools > Sensors
  3. ตั้งค่า Location

5.1.2 Pre-defined Locations

Location Latitude Longitude Use Case
Sanam Suea Pa 13.7563 100.5018 Bangkok office
Suvarnabhumi Airport 13.6900 100.7501 Outdoor high accuracy
Central World 13.7944 100.5439 Indoor
Null Island 0 0 Invalid coordinates
Out of Range 91 181 Out of range test

5.1.3 Custom Location

  1. เลือก "Other..." ใน Sensors tab
  2. ป้อน Latitude และ Longitude
  3. กด Enter

5.2 Network Throttling

5.2.1 Enable Throttling

  1. เปิด Chrome DevTools (F12)
  2. เลือก Network tab
  3. เลือก Throttling
  4. เลือก preset หรือ custom

5.2.2 Throttling Presets

Preset Download Upload Latency Use Case
Offline 0 0 - API failure test
Slow 3G 500 Kbps 500 Kbps 2000ms Slow network
Fast 3G 1.6 Mbps 750 Kbps 100ms Normal mobile

5.3 Console Testing

5.3.1 Test Location Validation

// Test 1: Valid coordinates
const validPosition = {
  coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 10 },
  timestamp: Date.now()
}
console.log(validateLocation(validPosition))
// Expected: { isValid: true, isMockDetected: false }

// Test 2: Invalid coordinates (0,0)
const invalidPosition = {
  coords: { latitude: 0, longitude: 0, accuracy: 10 },
  timestamp: Date.now()
}
console.log(validateLocation(invalidPosition))
// Expected: { isValid: false, isMockDetected: true, confidence: 'high' }

// Test 3: Stale timestamp
const stalePosition = {
  coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 10 },
  timestamp: Date.now() - 70000 // 70 seconds ago
}
console.log(validateLocation(stalePosition))
// Expected: errors = ["ข้อมูลตำแหน่งเก่าเกินไป..."]

// Test 4: Poor accuracy
const poorAccuracyPosition = {
  coords: { latitude: 13.7563, longitude: 100.5018, accuracy: 150 },
  timestamp: Date.now()
}
console.log(validateLocation(poorAccuracyPosition))
// Expected: warnings = ["ความแม่นยำตำแหน่งต่ำเกินไป..."]

5.3.2 Test Distance Calculation

// Test haversineDistance
const distance = haversineDistance(13.7563, 100.5018, 15.8700, 100.9925)
console.log(`Distance: ${distance} meters`)
// Expected: ~180,000 meters (180 km)

// Test speed calculation
const pos1 = { latitude: 13.7563, longitude: 100.5018, timestamp: Date.now() - 60000 }
const pos2 = { latitude: 15.8700, longitude: 100.9925, timestamp: Date.now() }
const speed = calculateSpeed(pos1, pos2)
console.log(`Speed: ${speed} m/s (${speed * 3.6} km/h)`)
// Expected: ~3000 km/h (> 100 m/s = 360 km/h)

6. Device-Specific Testing

6.1 Mobile Device Testing

6.1.1 Android Testing

Step Action Notes
1 Install Fake GPS App Google Play Store
2 Enable Developer Options Settings > About Phone > Build Number (7 taps)
3 Enable Mock Location Settings > Developer Options > Select mock location app
4 Set Fake Location Fake GPS App > Set Location
5 Open HRMS App Test mock detection

6.1.2 iOS Testing

Step Action Notes
1 Connect iPhone to Mac USB cable
2 Open Xcode Mac
3 Select Device > Debug Location Xcode menu
4 Set Custom Location Enter lat/lon
5 Open HRMS App Test mock detection

6.2 Desktop Browser Testing

6.2.1 Chrome Testing

Step Action Notes
1 Open Chrome -
2 Open DevTools F12
3 More tools > Sensors -
4 Set Location Choose or custom
5 Open HRMS App Test location

6.2.2 Edge Testing

Step Action Notes
1 Open Edge -
2 Open DevTools F12
3 More tools > Sensors -
4 Set Location Choose or custom
5 Open HRMS App Test location

7. Test Data & Scenarios

7.1 Valid Locations

Name Latitude Longitude Accuracy Expected
Sanam Suea Pa 13.7563 100.5018 <= 100m Pass
Suvarnabhumi 13.6900 100.7501 <= 100m Pass
Central World 13.7944 100.5439 <= 100m Pass
Chiang Mai 18.7883 98.9853 <= 100m Pass

7.2 Invalid Locations

Name Latitude Longitude Accuracy Expected
Null Island 0 0 Any Fail (invalid coordinates)
Out of Range (lat) 91 100.5018 Any Fail (invalid coordinates)
Out of Range (lon) 13.7563 181 Any Fail (invalid coordinates)
NaN NaN NaN Any Fail (invalid coordinates)

7.3 Edge Cases

Scenario Latitude Longitude Accuracy Timestamp Expected
Stale Data 13.7563 100.5018 10 t - 70s Fail (stale)
Poor Accuracy 13.7563 100.5018 150 current Warning
Impossible Speed 15.8700 100.9925 10 t + 60s (from 13.7563, 100.5018) Fail (speed)

8. Troubleshooting

8.1 Common Issues

Issue Cause Solution
ไม่ได้รับพิกัด GPS GPS ปิดอยู่ เปิด Location Service
แผนที่ไม่แสดง ยังไม่ยอมรับ Privacy Policy ยอมรับ Privacy Policy
ปุ่มลงเวลา disabled Mock location detected ปิด Fake GPS App และรีเฟรช
POI ไม่แสดง Bangkok GIS down รอ fallback ไป ArcGIS
ความแม่นยำต่ำ อยู่ในอาคาร ไปยังพื้นที่เปิดกว้าง

8.2 Debug Mode

Enable Debug Mode

  1. เปิด Console ใน Browser
  2. ตรวจสอบค่าต่าง ๆ:
// Check validation result
console.log('Validation:', validationResult)

// Check location granted
console.log('Location Granted:', locationGranted)

// Check mock detected
console.log('Mock Detected:', isMockLocationDetected)

// Check form location
console.log('Form Location:', formLocation)

// Check privacy accepted
console.log('Privacy Accepted:', privacyStore.isAccepted)

9. Test Execution Checklist

9.1 Pre-Test Checklist

  • ติดตั้ง Fake GPS App (สำหรับการทดสอบ mock location)
  • เปิด Developer Options (Android) หรือเตรียม Xcode (iOS)
  • เตรียม Test Data และ Test Scenarios
  • เตรียม Screenshot/Screen Recording tool
  • ตรวจสอบ Test Environment (Network, GPS, etc.)

9.2 During Test Checklist

  • บันทึกผลลัพธ์ทุก Test Case
  • ถ่าย Screenshot สำคัญ
  • บันทึกข้อผิดพลาดที่พบ
  • ตรวจสอบ Console logs
  • ตรวจสอบ Network requests

9.3 Post-Test Checklist

  • สรุปผลการทดสอบ
  • รายงาน bugs ที่พบ
  • อัปเดต Test Cases document
  • เตรียม Test Evidence (Screenshots, Videos)
  • ส่งรายงานให้ทีมที่เกี่ยวข้อง

10. References

10.2 External Resources


11. Revision History

Version Date Author Changes
1.0.0 2025-03-09 QA Team Initial version - Detailed test steps for Location features

12. Approval

Role Name Signature Date
QA Lead
Developer
Product Owner