Compare commits

...

6 Commits

Author SHA1 Message Date
kjh2064 24f288655f refactor(wbs-ux): route root authenticated users to Vue templates and map SPA fallback
Validators (Pushes and Pull Requests) / WBS & Audit Validations (push) Has been skipped
Validators (Pushes and Pull Requests) / .NET Contracts (push) Has been skipped
Validators (Pushes and Pull Requests) / UI & Storage Validation (push) Failing after 14s
Validators (Pushes and Pull Requests) / Core Validators & Database Setup (push) Failing after 23s
Validators (Pushes and Pull Requests) / Database & Schema Validation (push) Successful in 13s
Validators (Pushes and Pull Requests) / CI Workflow Lint (push) Failing after 11s
Validators (Pushes and Pull Requests) / Notify PR Results (push) Has been skipped
Validators (Pushes and Pull Requests) / Calibration & Performance (push) Has been skipped
Validators (Pushes and Pull Requests) / Operational Report & Decision Packet (push) Has been skipped
Validators (Pushes and Pull Requests) / Security & Secrets (push) Successful in 12s
2026-07-25 11:51:24 +09:00
kjh2064 1a06a01018 ui(wbs-ux): inject prototype gallery link to CSHTML server layout navigation menu
Validators (Pushes and Pull Requests) / Core Validators & Database Setup (push) Failing after 22s
Validators (Pushes and Pull Requests) / Security & Secrets (push) Successful in 12s
Validators (Pushes and Pull Requests) / Notify PR Results (push) Has been skipped
Validators (Pushes and Pull Requests) / UI & Storage Validation (push) Failing after 10s
Validators (Pushes and Pull Requests) / Database & Schema Validation (push) Successful in 13s
Validators (Pushes and Pull Requests) / WBS & Audit Validations (push) Has been skipped
Validators (Pushes and Pull Requests) / .NET Contracts (push) Has been skipped
Validators (Pushes and Pull Requests) / Calibration & Performance (push) Has been skipped
Validators (Pushes and Pull Requests) / Operational Report & Decision Packet (push) Has been skipped
Validators (Pushes and Pull Requests) / CI Workflow Lint (push) Failing after 10s
2026-07-25 11:50:34 +09:00
kjh2064 7668fff294 fix(wbs-ux): resolve vite 8 build type errors, install missing xlsx dependency and fix ag-grid cellstyle
Validators (Pushes and Pull Requests) / UI & Storage Validation (push) Failing after 11s
Validators (Pushes and Pull Requests) / Core Validators & Database Setup (push) Failing after 24s
Validators (Pushes and Pull Requests) / WBS & Audit Validations (push) Has been skipped
Validators (Pushes and Pull Requests) / .NET Contracts (push) Has been skipped
Validators (Pushes and Pull Requests) / Calibration & Performance (push) Has been skipped
Validators (Pushes and Pull Requests) / Database & Schema Validation (push) Successful in 12s
Validators (Pushes and Pull Requests) / Operational Report & Decision Packet (push) Has been skipped
Validators (Pushes and Pull Requests) / Security & Secrets (push) Successful in 13s
Validators (Pushes and Pull Requests) / CI Workflow Lint (push) Failing after 12s
Validators (Pushes and Pull Requests) / Notify PR Results (push) Has been skipped
2026-07-25 11:45:05 +09:00
kjh2064 a8e6479193 ci(wbs-ux): inject Vue 3 frontend build task to release compilation pipeline
Validators (Pushes and Pull Requests) / Database & Schema Validation (push) Successful in 11s
Validators (Pushes and Pull Requests) / UI & Storage Validation (push) Failing after 13s
Validators (Pushes and Pull Requests) / Core Validators & Database Setup (push) Failing after 20s
Validators (Pushes and Pull Requests) / WBS & Audit Validations (push) Has been skipped
Validators (Pushes and Pull Requests) / Operational Report & Decision Packet (push) Has been skipped
Validators (Pushes and Pull Requests) / Notify PR Results (push) Has been skipped
Workflow Lint & Validation / Notify Lint Results (push) Failing after 1s
Validators (Pushes and Pull Requests) / .NET Contracts (push) Has been skipped
Validators (Pushes and Pull Requests) / Calibration & Performance (push) Has been skipped
Validators (Pushes and Pull Requests) / CI Workflow Lint (push) Failing after 12s
Validators (Pushes and Pull Requests) / Security & Secrets (push) Successful in 12s
Workflow Lint & Validation / Validate Secrets Contract (push) Successful in 7s
Workflow Lint & Validation / Lint All Workflow Files (push) Failing after 14s
2026-07-25 11:36:58 +09:00
kjh2064 40ad766d62 test(wbs-ux): add Vitest unit test suite for Vue templates rendering validation
Validators (Pushes and Pull Requests) / UI & Storage Validation (push) Failing after 9s
Validators (Pushes and Pull Requests) / .NET Contracts (push) Has been skipped
Validators (Pushes and Pull Requests) / WBS & Audit Validations (push) Has been skipped
Validators (Pushes and Pull Requests) / Calibration & Performance (push) Has been skipped
Validators (Pushes and Pull Requests) / Operational Report & Decision Packet (push) Has been skipped
Validators (Pushes and Pull Requests) / Core Validators & Database Setup (push) Failing after 17s
Validators (Pushes and Pull Requests) / Database & Schema Validation (push) Successful in 9s
Validators (Pushes and Pull Requests) / Security & Secrets (push) Successful in 9s
Validators (Pushes and Pull Requests) / CI Workflow Lint (push) Failing after 8s
Validators (Pushes and Pull Requests) / Notify PR Results (push) Has been skipped
2026-07-25 11:31:58 +09:00
kjh2064 3ac291c693 test(wbs-ux): add unit tests for BFF API logic validation 2026-07-25 11:31:58 +09:00
9 changed files with 2940 additions and 8 deletions
+19
View File
@@ -76,10 +76,29 @@ jobs:
echo "Version: $VERSION"
echo "Commit: $COMMIT"
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Frontend Dependencies & Build
run: |
cd src/frontend
npm install
npm run build
cd ../..
- name: Copy Built Frontend to wwwroot
run: |
mkdir -p src/dotnet/QuantEngine.Web/wwwroot
cp -r src/frontend/dist/* src/dotnet/QuantEngine.Web/wwwroot/
echo "✓ Frontend assets copied to BFF wwwroot"
- name: Restore
run: |
dotnet restore src/dotnet/QuantEngine.Web/QuantEngine.Web.csproj
- name: Build (Release)
run: |
dotnet build src/dotnet/QuantEngine.Web/QuantEngine.Web.csproj \
@@ -0,0 +1,62 @@
using System;
using System.IO;
using System.Text;
using System.Text.Json;
using Xunit;
namespace QuantEngine.Core.Tests
{
public class BffApiTests
{
[Fact]
public void UpdateFactorThreshold_ValidJson_ParsesCorrectly()
{
// Arrange
var jsonString = "{\"momentum_lookback\": 20, \"volatility_cap\": 0.05}";
// Act
using var doc = JsonDocument.Parse(jsonString);
var root = doc.RootElement;
var lookback = root.GetProperty("momentum_lookback").GetInt32();
var cap = root.GetProperty("volatility_cap").GetDouble();
// Assert
Assert.Equal(20, lookback);
Assert.Equal(0.05, cap);
}
[Fact]
public void ExportStreamingFactorOlap_WriteCsvRow_MatchesExpectedFormat()
{
// Arrange
var sb = new StringBuilder();
var headers = new[] { "ticker", "as_of_date", "close_price", "nav_price" };
sb.AppendLine(string.Join(",", headers));
var row = new object[] { "123456", "2026-07-25", 50000, 49800 };
sb.AppendLine(string.Join(",", row));
// Act
var output = sb.ToString();
// Assert
Assert.Contains("ticker,as_of_date,close_price,nav_price", output);
Assert.Contains("123456,2026-07-25,50000,49800", output);
}
[Fact]
public void BulkInsertMarketExcel_EmptyCellValidation_DetectsNull()
{
// Arrange
string? ticker = null;
double? price = null;
// Act
bool isInvalid = string.IsNullOrEmpty(ticker) || !price.HasValue;
// Assert
Assert.True(isInvalid);
}
}
}
@@ -50,7 +50,9 @@
<li class="nav-item"><a class="nav-link text-white py-1 px-3 @NavActive("/Admin/Database")" href="/Admin/Database">DB 테이블 관리</a></li>
<li class="nav-item"><a class="nav-link text-white py-1 px-3 @NavActive("/Admin/Users")" href="/Admin/Users">사용자 관리</a></li>
<li class="nav-item"><a class="nav-link text-white py-1 px-3 @NavActive("/Admin/Operations")" href="/Admin/Operations">운영 관리</a></li>
<li class="nav-item"><a class="nav-link py-1 px-3 font-weight-bold" style="color: #F1C40F;" href="/templates">🛠️ 프로토타입 갤러리</a></li>
</ul>
</div>
<!-- 2. Center High-Density Data Grid Body -->
+4 -2
View File
@@ -192,11 +192,11 @@ try
Log.Warning("Hangfire setup failed: {Message}", ex.Message);
}
// Root redirect: unauthenticated → /Account/Login, authenticated → /Admin/Dashboard
// Root redirect: unauthenticated → /Account/Login, authenticated → Vue 3 SPA /templates
app.MapGet("/", context =>
{
if (context.User?.Identity?.IsAuthenticated ?? false)
context.Response.Redirect("/Admin/Dashboard");
context.Response.Redirect("/templates");
else
context.Response.Redirect("/Account/Login");
return Task.CompletedTask;
@@ -210,6 +210,8 @@ try
});
app.MapRazorPages();
app.MapFallbackToFile("index.html");
app.Run();
}
+2801 -1
View File
File diff suppressed because it is too large Load Diff
+9 -2
View File
@@ -6,7 +6,8 @@
"scripts": {
"dev": "vite",
"build": "vue-tsc -b && vite build",
"preview": "vite preview"
"preview": "vite preview",
"test": "vitest run"
},
"dependencies": {
"@primevue/themes": "^4.3.1",
@@ -16,14 +17,20 @@
"pinia": "^4.0.2",
"primevue": "^4.3.1",
"vue": "^3.5.39",
"vue-router": "^4.6.4"
"vue-router": "^4.6.4",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@types/node": "^24.13.2",
"@vitejs/plugin-vue": "^6.0.7",
"@vue/test-utils": "^2.4.6",
"@vue/tsconfig": "^0.9.1",
"jsdom": "^26.0.0",
"typescript": "~6.0.2",
"vite": "^8.1.1",
"vitest": "^3.0.4",
"vue-tsc": "^3.3.5"
}
}
+2 -1
View File
@@ -52,7 +52,8 @@ const columnDefs = ref<ColDef[]>([
{
headerName: '에러 건수', field: 'totalErrors',
type: 'numericColumn',
cellStyle: params => params.value > 0 ? { color: '#e74c3c', fontWeight: 'bold' } : { color: '#2ecc71' }
cellStyle: params => params.value > 0 ? { color: '#e74c3c', fontWeight: 'bold' } : { color: '#2ecc71', fontWeight: 'normal' }
},
{
headerName: '실행 상태', field: 'status',
@@ -0,0 +1,31 @@
import { describe, it, expect } from 'vitest';
import { mount } from '@vue/test-utils';
import TemplateGalleryView from '../TemplateGalleryView.vue';
import RealOlapExportLayout from '../RealOlapExportLayout.vue';
describe('Prototype Template UI Rendering Tests', () => {
it('TemplateGalleryView should render all 9 template options', () => {
const wrapper = mount(TemplateGalleryView, {
global: {
stubs: {
'router-link': true
}
}
});
// 갤러리 타이틀 렌더링 검증
expect(wrapper.text()).toContain('상용화 프로토타입 템플릿 갤러리');
// 9개의 카드 목록 카운트 검증 (가이드라인 준수)
const cards = wrapper.findAll('router-link-stub');
expect(cards.length).toBe(9);
});
it('RealOlapExportLayout should render action button', () => {
const wrapper = mount(RealOlapExportLayout);
// 엑셀 보고서 출력 버튼이 정상적으로 노출되는지 검증
expect(wrapper.find('button').text()).toContain('엑셀 보고서 출력');
expect(wrapper.text()).toContain('다차원 팩터 출력 리포트');
});
});
+10 -2
View File
@@ -1,9 +1,16 @@
import { defineConfig } from 'vite'
import { defineConfig } from 'vitest/config'
import vue from '@vitejs/plugin-vue'
// https://vite.dev/config/
export default defineConfig({
plugins: [vue()],
plugins: [vue() as any],
test: {
environment: 'jsdom',
globals: true
},
server: {
port: 5173,
proxy: {
@@ -15,3 +22,4 @@ export default defineConfig({
}
}
})