This is a modification of the App.tsx
and App.test.tsx
CRAs. It uses useEffect
to get the text from the Golang API.
- Source code: https://github.com/ynwd/mnrp
- Live demo: https://fastro-319406.firebaseapp.com/
. ├── cloudbuild.yaml ├── cmd │ ├── build │ │ ├── index.gohtml │ │ └── main.go │ └── main.go ├── firebase.json ├── go.mod ├── internal │ ├── app.go │ └── app_test.go ├── package.json ├── serverless.go └── web └── home ├── craco.config.js ├── package.json ├── public ├── src │ ├── App.css │ ├── App.test.tsx │ ├── App.tsx │ ├── index.css │ ├── index.tsx │ ├── logo.svg │ ├── react-app-env.d.ts │ ├── reportWebVitals.ts │ └── setupTests.ts ├── tailwind.config.js └── tsconfig.json
Backend
Golang API
package internal import ( "context" "github.com/fastrodev/fastrex" ) func Handler(req fastrex.Request, res fastrex.Response) { res.Send("The best interface is no interface") } func CreateApp() fastrex.App { ctx := context.Background() app := fastrex.New() app.Ctx(ctx) app.Get("/api", Handler) return app }
Entry point
package serverless import ( "net/http" "github.com/ynwd/mnrp/internal" ) func Main(w http.ResponseWriter, r *http.Request) { internal.CreateApp().Serverless(true).ServeHTTP(w, r) }
Frontend
App.tsx
import React, { useEffect, useState } from 'react'; import logo from './logo.svg'; import './App.css'; function App() { const [value, setValue] = useState(""); useEffect(() => { async function getText() { let response = await fetch('/api') const d = await response.text() setValue(d) } getText() }, [value]); return ( <div className="App"> <header className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <h3> {value} </h3> </header> </div> ); } export default App;
App.test.tsx
import React from 'react'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; import { render, screen } from '@testing-library/react'; import App from './App'; const server = setupServer( rest.get('/api', async (req, res, ctx) => { return res(ctx.text("The best interface is no interface")); }) ); beforeAll(() => server.listen()); afterEach(() => server.resetHandlers()); afterAll(() => server.close()); test('loads and displays greeting', async () => { render(<App />); const linkElement = await screen.findByText('The best interface is no interface'); screen.debug() expect(linkElement).toBeInTheDocument(); });
Top comments (0)