Skip to content

Commit

Permalink
build: add bindings ts tests to ci
Browse files Browse the repository at this point in the history
Add tests from AhaLabs#11 which didn't make it into #973 due to the quickstart image not starting properly in CI.

Adding this directly to #973 was costing too much time. We can troubleshoot quickstart issues here.

Update for latest changes from `soroban config identity` to `soroban
keys`
  • Loading branch information
chadoh committed Jan 11, 2024
1 parent 8906a53 commit 5941422
Show file tree
Hide file tree
Showing 9 changed files with 98 additions and 46 deletions.
43 changes: 43 additions & 0 deletions .github/workflows/bindings-ts.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@

name: bindings typescript

on:
push:
branches: [main, release/**]
pull_request:

jobs:
test:
name: test generated libraries
runs-on: ubuntu-22.04
services:
rpc:
image: stellar/quickstart:soroban-dev@sha256:0ad51035cf7caba2fd99c7c1fad0945df6932be7d5c893e1520ccdef7d6a6ffe
ports:
- 8000:8000
env:
ENABLE_LOGS: true
NETWORK: local
ENABLE_SOROBAN_RPC: true
options: >-
--health-cmd "curl --no-progress-meter --fail-with-body -X POST \"http://localhost:8000/soroban/rpc\" -H 'Content-Type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":8675309,\"method\":\"getNetwork\"}' && curl --no-progress-meter \"http://localhost:8000/friendbot\" | grep '\"invalid_field\": \"addr\"'"
--health-interval 10s
--health-timeout 5s
--health-retries 50
steps:
- uses: actions/checkout@v3
- uses: actions/cache@v3
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- run: rustup update
- run: cargo build
- run: rustup target add wasm32-unknown-unknown
- run: make build-test-wasms
- run: npm ci && npm run test
working-directory: cmd/crates/soroban-spec-typescript/ts-tests
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"dependencies": {
"@stellar/freighter-api": "1.7.1",
"buffer": "6.0.3",
"stellar-sdk": "11.1.0"
"stellar-sdk": "11.2.0"
},
"scripts": {
"build": "node ./scripts/build.mjs"
Expand All @@ -15,6 +15,6 @@
},
"typings": "dist/types/index.d.ts",
"devDependencies": {
"typescript": "5.1.6"
"typescript": "5.3.3"
}
}
1 change: 0 additions & 1 deletion cmd/crates/soroban-spec-typescript/ts-tests/.nvmrc

This file was deleted.

25 changes: 15 additions & 10 deletions cmd/crates/soroban-spec-typescript/ts-tests/initialize.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,28 @@ echo " Passphrase: \"$SOROBAN_NETWORK_PASSPHRASE\""
NETWORK_STATUS=$(curl -s -X POST "http://localhost:8000/soroban/rpc" -H "Content-Type: application/json" -d '{ "jsonrpc": "2.0", "id": 8675309, "method": "getHealth" }' | sed 's/.*"status":"\(.*\)".*/\1/') || { echo "Make sure you're running local RPC network on localhost:8000" && exit 1; }
echo " Status: $NETWORK_STATUS"

if [[ "$NETWORK_STATUS" != "healthy" ]]; then
echo "Network is not healthy (not running?), exiting"
exit 1
fi

# Print command before executing, from https://stackoverflow.com/a/23342259/249801
# Discussion: https://github.com/stellar/soroban-tools/pull/1034#pullrequestreview-1690667116
exe() { echo"${@/eval/}" ; "$@" ; }

function fund_all() {
exe eval "./soroban config identity fund"
exe eval "./soroban config identity generate alice"
exe eval "./soroban config identity fund alice"
exe eval "./soroban config identity generate bob"
exe eval "./soroban config identity fund bob"
exe eval "./soroban keys generate root"
exe eval "./soroban keys fund root"
exe eval "./soroban keys generate alice"
exe eval "./soroban keys fund alice"
exe eval "./soroban keys generate bob"
exe eval "./soroban keys fund bob"
}
function upload() {
exe eval "(./soroban contract $1 --wasm $2 --ignore-checks) > $3"
exe eval "(./soroban contract $1 --source root --wasm $2 --ignore-checks) > $3"
}
function deploy() {
exe eval "(./soroban contract deploy --wasm-hash $(cat $1) --ignore-checks) > $2"
exe eval "(./soroban contract deploy --source root --wasm-hash $(cat $1) --ignore-checks) > $2"
}
function deploy_all() {
upload deploy ../../../../target/wasm32-unknown-unknown/test-wasms/test_custom_types.wasm contract-id-custom-types.txt
Expand All @@ -42,7 +48,7 @@ function deploy_all() {
deploy contract-token-hash.txt contract-id-token-b.txt
}
function initialize() {
exe eval "./soroban contract invoke --id $(cat $1) -- initialize --admin $(./soroban config identity address) --decimal 0 --name 'Token $2' --symbol '$2'"
exe eval "./soroban contract invoke --source root --id $(cat $1) -- initialize --admin $(./soroban keys address root) --decimal 0 --name 'Token $2' --symbol '$2'"
}
function initialize_all() {
initialize contract-id-token-a.txt A
Expand All @@ -59,14 +65,13 @@ function bind_all() {
}

function mint() {
exe eval "./soroban contract invoke --id $(cat $1) -- mint --amount 2000000 --to $(./soroban config identity address $2)"
exe eval "./soroban contract invoke --source root --id $(cat $1) -- mint --amount 2000000 --to $(./soroban keys address $2)"
}
function mint_all() {
mint contract-id-token-a.txt alice
mint contract-id-token-b.txt bob
}

curl -X POST "http://localhost:8000/soroban/rpc" || { echo "Make sure you're running standalone RPC network on localhost:8000" && exit 1; }
fund_all
deploy_all
initialize_all
Expand Down
26 changes: 13 additions & 13 deletions cmd/crates/soroban-spec-typescript/ts-tests/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions cmd/crates/soroban-spec-typescript/ts-tests/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
"ava": "^5.3.1",
"dotenv": "^16.3.1",
"eslint": "^8.53.0",
"stellar-sdk": "11.1.0",
"typescript": "^5.1.6"
"stellar-sdk": "11.2.0",
"typescript": "^5.3.3"
},
"ava": {
"typescript": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,18 +50,21 @@ test("strukt", async (t) => {
})

test('simple first', async t => {
const simple = { tag: 'First', values: undefined } as const
t.deepEqual((await contract.simple({ simple })).result, simple)
const arg = { tag: 'First', values: undefined } as const
const ret = { tag: 'First' }
t.deepEqual((await contract.simple({ simple: arg })).result, ret)
})

test('simple second', async t => {
const simple = { tag: 'Second', values: undefined } as const
t.deepEqual((await contract.simple({ simple })).result, simple)
const arg = { tag: 'Second', values: undefined } as const
const ret = { tag: 'Second' }
t.deepEqual((await contract.simple({ simple: arg })).result, ret)
})

test('simple third', async t => {
const simple = { tag: 'Third', values: undefined } as const
t.deepEqual((await contract.simple({ simple })).result, simple)
const arg = { tag: 'Third', values: undefined } as const
const ret = { tag: 'Third' }
t.deepEqual((await contract.simple({ simple: arg })).result, ret)
})

test('complex with struct', async t => {
Expand All @@ -72,29 +75,30 @@ test('complex with struct', async t => {

test('complex with tuple', async t => {
const arg = { tag: 'Tuple', values: [[{ a: 0, b: true, c: 'hello' }, { tag: 'First', values: undefined }]] } as const
const ret = { tag: 'Tuple', values: [[{ a: 0, b: true, c: 'hello' }, { tag: 'First', values: undefined }]] }
const ret = { tag: 'Tuple', values: [[{ a: 0, b: true, c: 'hello' }, { tag: 'First' }]] }
t.deepEqual((await contract.complex({ complex: arg })).result, ret)
})

test('complex with enum', async t => {
const arg = { tag: 'Enum', values: [{ tag: 'First', values: undefined }] } as const
const ret = { tag: 'Enum', values: [{ tag: 'First', values: undefined }] }
const ret = { tag: 'Enum', values: [{ tag: 'First' }] }
t.deepEqual((await contract.complex({ complex: arg })).result, ret)
})

test('complex with asset', async t => {
const arg = { tag: 'Asset', values: [publicKey, 1n] } as const
const ret = { tag: 'Asset', values: [addr, 1n] }
const ret = { tag: 'Asset', values: [publicKey, 1n] }
t.deepEqual((await contract.complex({ complex: arg })).result, ret)
})

test('complex with void', async t => {
const complex = { tag: 'Void', values: undefined } as const
t.deepEqual((await contract.complex({ complex })).result, complex)
const arg = { tag: 'Void', values: undefined } as const
const ret = { tag: 'Void' }
t.deepEqual((await contract.complex({ complex: arg })).result, ret)
})

test('addresse', async t => {
t.deepEqual((await contract.addresse({ addresse: publicKey })).result, addr)
t.deepEqual((await contract.addresse({ addresse: publicKey })).result, publicKey)
})

test('bytes', async t => {
Expand Down Expand Up @@ -138,7 +142,8 @@ test('map', async t => {
map.set(1, true)
map.set(2, false)
// map.set(3, 'hahaha') // should throw an error
t.deepEqual((await contract.map({ map })).result, map)
const ret = Array.from(map.entries())
t.deepEqual((await contract.map({ map })).result, ret)
})

test('vec', async t => {
Expand Down Expand Up @@ -178,6 +183,6 @@ test('string', async t => {

test('tuple_strukt', async t => {
const arg = [{ a: 0, b: true, c: 'hello' }, { tag: 'First', values: undefined }] as const
const res = [{ a: 0, b: true, c: 'hello' }, { tag: 'First', values: undefined }]
const res = [{ a: 0, b: true, c: 'hello' }, { tag: 'First' }]
t.deepEqual((await contract.tupleStrukt({ tuple_strukt: arg })).result, res)
})
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ test("auth", async (t) => {
addr: root.keypair.publicKey(),
world: 'lol'
})).result,
root.address
root.keypair.publicKey()
)
});

Expand Down
6 changes: 3 additions & 3 deletions cmd/crates/soroban-spec-typescript/ts-tests/src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { spawnSync } from "node:child_process";
import { Keypair, TransactionBuilder, hash } from "stellar-sdk";
import { Address } from 'test-custom-types'

const rootKeypair = Keypair.fromSecret(spawnSync("./soroban", ["config", "identity", "show"], { shell: true, encoding: "utf8" }).stdout.trim());
const aliceKeypair = Keypair.fromSecret(spawnSync("./soroban", ["config", "identity", "show", "alice"], { shell: true, encoding: "utf8" }).stdout.trim());
const bobKeypair = Keypair.fromSecret(spawnSync("./soroban", ["config", "identity", "show", "bob"], { shell: true, encoding: "utf8" }).stdout.trim());
const rootKeypair = Keypair.fromSecret(spawnSync("./soroban", ["keys", "show", "root"], { shell: true, encoding: "utf8" }).stdout.trim());
const aliceKeypair = Keypair.fromSecret(spawnSync("./soroban", ["keys", "show", "alice"], { shell: true, encoding: "utf8" }).stdout.trim());
const bobKeypair = Keypair.fromSecret(spawnSync("./soroban", ["keys", "show", "bob"], { shell: true, encoding: "utf8" }).stdout.trim());

export const root = {
keypair: rootKeypair,
Expand Down

0 comments on commit 5941422

Please sign in to comment.